【问题标题】:convert string array of byte values to a byte array将字节值的字符串数组转换为字节数组
【发布时间】:2012-05-16 09:40:08
【问题描述】:

我在表单上有一个文本框,其中一个人以如下所示的格式输入字节数组。

我的问题是如何将生成的字符串数组转换为具有相同值的字节数组?

所以这将被输入到文本框中:

0x11, 0x01, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x53, 0x75, 0x6D, 0x6D, 0x61, 0x72, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00

下面的代码然后将其拆分并转换为字节数组

string text = txtChecksumText.Text;
        string[] parts = text.Split(new string[] { ", " }, StringSplitOptions.None);
        byte[] bytes = new byte[parts.Length];

        for (int i = 0; i < parts.Length; i++)
        {
            bytes[i] = Convert.ToByte(parts[i], 16); // this isn't working as expected
            txtResponse.Text += Environment.NewLine + "     " + i + " = " + parts[i] + " = " + bytes[i].ToString() ;
        }

显示它不起作用的响应

 0 = 0x11 = 17
 1 = 0x01 = 1
 2 = 0x49 = 73
 3 = 0x4D = 77
 4 = 0x41 = 65
 5 = 0x47 = 71
 6 = 0x45 = 69
 7 = 0x31 = 49
 8 = 0x00 = 0
 9 = 0x00 = 0
 10 = 0x00 = 0
 11 = 0x00 = 0
 12 = 0x00 = 0
 13 = 0x00 = 0
 14 = 0x00 = 0
 15 = 0x00 = 0
 16 = 0x00 = 0
 17 = 0x00 = 0
 18 = 0x00 = 0
 19 = 0x00 = 0
 20 = 0x00 = 0
 21 = 0x00 = 0
 22 = 0x00 = 0
 23 = 0x01 = 1
 24 = 0x53 = 83
 25 = 0x75 = 117
 26 = 0x6D = 109
 27 = 0x6D = 109
 28 = 0x61 = 97
 29 = 0x72 = 114
 30 = 0x79 = 121
 31 = 0x00 = 0
 32 = 0x00 = 0
 33 = 0x00 = 0
 34 = 0x00 = 0
 35 = 0x00 = 0
 36 = 0x00 = 0
 37 = 0x00 = 0
 38 = 0x00 = 0
 39 = 0x00 = 0
 40 = 0x00 = 0
 41 = 0x00 = 0
 42 = 0x00 = 0
 43 = 0x00 = 0
 44 = 0x00 = 0
 45 = 0x00 = 0
 46 = 0x00 = 0
 47 = 0x00 = 0
 48 = 0x00 = 0
 49 = 0x00 = 0
 50 = 0x00 = 0
 51 = 0x00 = 0
 52 = 0x00 = 0
 53 = 0x00 = 0
 54 = 0x00 = 0
 55 = 0x00 = 0

为了清楚起见,0x11 应该以字节 11 而不是字节 17 的形式返回,与所有其他人一样我不想转换为十进制我正在尝试将文字字节字符串转换为字节数组用于创建校验和

【问题讨论】:

  • 抱歉,请问有什么问题?据我所知,它似乎工作正常。
  • 例如0x45转换为69的问题?那是因为 0x45(十六进制的 45 实际上是十进制的 69)
  • 0x11 应该作为字节 11 而不是字节 17 返回,与所有其他字节相同用于创建校验和
  • 如果你想让 0x11 是 11 而不是 17,你到底想让 0x6D 是什么?
  • 和 0x11 11 的字节... 十六进制。这里唯一的问题是您的bytes[i].ToString() 是以十进制写入字节......字节本身没有任何十进制或十六进制的概念,它是二进制的。

标签: c# bytearray arrays


【解决方案1】:

你得到的字节只是字节;它们本质上不是十进制或十六进制。

如果您想将字节传递给其他东西(用于校验和),它们很好。

您唯一的问题是您以十进制形式将它们写入控制台 - 如果您出于任何原因希望以十六进制形式将它们写出,请使用 ToString("x")

【讨论】:

    【解决方案2】:

    请执行以下操作:

    txtHexString.Text="0x11, 0x01, 0x49, 0x4D, 0x41, 0x47, 0x45, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x53, 0x75, 0x6D, 0x6D, 0x61, 0x72, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00";
    
    string[] namesArray =  txtHexString.Text.Split(',');
    byte[] abc= new byte [namesArray.Length];
    
    for (int i = 0; i <= namesArray.Length - 1; i = i + 1)
            {
                abc[i] = Convert.ToByte(namesArray[i].Replace(" ", ""), 16);
            }
    

    这里,abc 是所需的字节数组。现在用 abc 做任何你想做的事。

    【讨论】:

      【解决方案3】:

      您的代码正在运行。检查此以观察不同的转换并选择您需要的任何内容:

      MessageBox.Show(11.ToString());
      MessageBox.Show(11.ToString("x"));
      MessageBox.Show(0x11.ToString());
      MessageBox.Show(0x11.ToString("x"));
      MessageBox.Show(BitConverter.ToString(new byte[] { 11, 0x11, 16 }));
      

      【讨论】:

        猜你喜欢
        • 2021-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        相关资源
        最近更新 更多