将字符串转换为字节



我有一个以下格式的J1939 CAN原始字符串:

CAN:0B00FEE99CF002000CEF02000B00FEE81A9A9F60FFFFB8570B00FEE042522500425225000B00FEE5E0530100C89F0400

此字符串包含一些分成 3 部分的 CAN 消息,例如

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;

您可能需要在此处检查以将十六进制字符串转换为字节数组: 如何将十六进制字符串转换为字节数组?

然后你应该使用 MemoryStream/BinaryReader。(转换将 int 保存为 LSB 的十六进制字符串不会产生与将十六进制直接转换为整数相同的值,因为这样您将像 MSB 一样解析它)。请参阅关于字节序的维基。

因此,要么使用 BinaryReader 将字节转换为 int,要么使用 BitConverter .

你可以尝试这样的东西:(伪)

int pgnDataLength;
int pgnNumber;
long CANData;
// this function is found on the stackoverflow 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();
}

您是正确的,您需要转换为字节。 您的索引已关闭,因为一个字节是两个半字节。 请参阅下面的代码

            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);
            }

相关内容

  • 没有找到相关文章

最新更新