C# 将字符串转换为字节

C# 将字符串转换为字节,c#,parsing,can-bus,j1939,C#,Parsing,Can Bus,J1939,我有一个J1939 CAN原始字符串,格式如下: CAN:0B00FEE99CF002000CEF02000B00FEE81A9A9F60FFFFB8570B00FEE042522500425225000B00FEE5E0530100C89F0400 例如,该字符串包含一些CAN消息,这些消息被分成3个部分 0B 00FEE99 CF002000CEF0200 1) PGN数据长度(字节)0B 2) PGN编号(长度为3字节)0FEE99 3) PGN数据CF002000CEF0200 目前

我有一个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;
int CANStrLength=24;
int CANIndex=CANDataIndex(rawDataElements);
int CANStrIndex=rawDataElements[CANIndex].IndexOf(“CAN:”);
字符串CANmessage=rawDataElements[CANIndex]。子字符串(CANStrIndex+4)。拆分(',).First();
Console.WriteLine(“\nRAWDATELEMENTS[{0}]:{1}\nCAN数据长度:{2}”,CANIndex,CANmessage,CANmessage.Length);
int numberOfCANMessages=CANmessage.Length/CANStrLength;
WriteLine(“有{0}条CAN消息”,numberOfCANMessages);
列表CANMessages=SplitIntoParts(CANmessage,CANStrLength);
对于(int i=0;i
您可能希望在此处选中以将十六进制字符串转换为字节数组:

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

因此,要么使用a将字节转换为int,要么使用

您可以尝试以下方法:(伪)


您可能希望在此处选中以将十六进制字符串转换为字节数组:

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

因此,要么使用a将字节转换为int,要么使用

您可以尝试以下方法:(伪)


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

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

            }
字符串输入=“0B00FEE99CF002000CEF0000B00FEE81A9A9F60FFB8570B00FEE0425225004252225000B00FEE5E0530100C89F0400”;
列表字节=新列表();
对于(int i=0;i
您需要转换为字节,这是正确的。由于一个字节是两个半字节,因此您的索引已关闭。请参阅下面的代码

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

            }
字符串输入=“0B00FEE99CF002000CEF0000B00FEE81A9A9F60FFB8570B00FEE0425225004252225000B00FEE5E0530100C89F0400”;
列表字节=新列表();
对于(int i=0;i
代码不起作用,因为输入是字符串而不是二进制。您是否花时间读取它?函数将在字节数组中转换字符串…请在注释之前再次读取。您将获得每个字符的ascii值,而不是字节值。不。stackoverflow链接的函数将每个2个十六进制值转换为一个字节。和将连接到字节数组。我没有看到您正在调用StringTobyteArray。但我的代码还是简单得多。您只需要使用byte.Parse();代码无法工作,因为输入是字符串而不是二进制。您是否花时间读取它?该函数将在字节数组中转换字符串…请在注释之前再次读取。您将获得每个字符的ascii值,而不是字节值。否。从stackoverflow链接的函数将每个2个十六进制值转换为一个字节。be连接到字节数组。我没有看到您正在调用StringTobyteArray。但我的代码还是简单得多。您只需要使用byte.Parse();是的,转换为字节数组可能更容易(请参见anwers bwlow),但您的代码也应该可以工作。哪些值是错误的?请使用调试器或程序输出检查您正在转换的字符串的部分。可能这只是误解。在您的示例中,您说的是
PGN number 3 bytes
(字符串中有6个字符),但字符串“00FEE99”是七个字符长。@H.G.Sandhagen-PGN是六个字符长
0FEE99
@H.G.Sandhagen我得到了错误的数据部分。我用示例数据尝试了您的代码:长度:1字节0B(11),PGN 3字节00FEE9(65257),数据8字节0:9c1:F0 2:02 3:00 4:0c5:EF 6:02 7:00。在交换机中,找到
案例65257:
,并提取数据部分(字节4-5),它是0CEF(3311)乘以0.5=1655.5。我不知道消息规范,也不能说这个值是否正确。您期望哪个值?是的,可能更容易转换为字节数组(参见anwers bwlow),但您的代码也应该工作。哪些值是错误的?请使用调试器或程序输出检查您正在转换的字符串部分。可能这只是误解。在您的示例中,您说的是
PGN number 3 bytes