Преобразовать строку в байты
У меня есть необработанная строка J1939 CAN в следующем формате:
CAN:0B00FEE99CF002000CEF02000B00FEE81A9A9F60FFFFB8570B00FEE042522500425225000B00FEE5E0530100C89F0400
Эта строка содержит несколько сообщений CAN, которые разбиты на 3 части, например
0B 00FEE99 CF002000CEF0200
1) длина данных PGN в байтах 0B
2) номер PGN (3 байта в длину) 0FEE99
3) данные PGN CF002000CEF0200
В настоящее время я использую подстроки для анализа 3 частей, но я не получаю правильные значения. Я думаю, что я мог ошибиться, потому что я не преобразовал строку в байтовый массив. Это часть моего кода:
int CANStrLength = 24;
int CANIndex = CANDataIndex(rawDataElements);
int CANStrIndex = rawDataElements[CANIndex].IndexOf("CAN:");
string CANmessage = rawDataElements[CANIndex].Substring(CANStrIndex + 4).Split(',').First();
Console.WriteLine("\nIn rawDataElements[{0}]: {1}\nLength of CAN data: {2}", CANIndex, CANmessage, CANmessage.Length);
int numberOfCANMessages = CANmessage.Length / CANStrLength;
Console.WriteLine("There are {0} CAN messages", numberOfCANMessages);
List<string> CANMessages = SplitIntoParts(CANmessage, CANStrLength);
for (int i = 0; i < numberOfCANMessages; i++)
{
int pgnDataLength = Convert.ToInt32(CANMessages[i].Substring(0, 2), 16);
int pgnNumber = Convert.ToInt32(CANMessages[i].Substring(2, 6), 16);
long CANData = Convert.ToInt64(CANMessages[i].Substring(8), 16);
Console.WriteLine();
Console.WriteLine(CANMessages[i]);
switch (pgnNumber)
{
// fuel consumption */
case 65257:
string totalFuelUsedStr = CANMessages[i].Substring(8).Substring(8, 4);
double totalFuelUsed = Convert.ToInt32(totalFuelUsedStr, 16) * 0.5;
Console.WriteLine("Total Fuel Used: {0}L, {1}gal", totalFuelUsed, (int)(totalFuelUsed* 0.26));
break;
2 ответа
Вы правы, что вам нужно конвертировать в байты. Ваша индексация отключена, поскольку байт состоит из двух частей. Смотрите код ниже
string input = "0B00FEE99CF002000CEF02000B00FEE81A9A9F60FFFFB8570B00FEE042522500425225000B00FEE5E0530100C89F0400";
List<byte> bytes = new List<byte>();
for (int i = 0; i < input.Length; i += 2)
{
byte newByte = byte.Parse(input.Substring(i,2), System.Globalization.NumberStyles.HexNumber);
bytes.Add(newByte);
}
Вы можете проверить здесь, чтобы преобразовать шестнадцатеричную строку в байтовый массив: Как я могу преобразовать шестнадцатеричную строку в байтовый массив?
Тогда вы должны использовать MemoryStream / BinaryReader. (Преобразование шестнадцатеричной строки с целым числом, сохраненным как LSB, не приводит к тому же значению, что и преобразование шестнадцатеричного кода непосредственно в целое число, потому что тогда вы будете анализировать его как MSB). Смотрите вики на Endianness.
Так что либо вы используете BinaryReader для преобразования байтов в int, либо вы можете использовать BitConverter
,
Вы можете попробовать что-то вроде: (PSEUDO)
int pgnDataLength;
int pgnNumber;
long CANData;
// this function is found on the stackru link above
byte[] data = StringToByteArray(hex);
using(memStream = new MemoryStream(data))
{
var reader = new BinaryReader(memStream);
pgnDataLength = reader.ReadInt32();
pgnNumber = reader.ReadInt32();
CANData = reader.ReadInt64();
}