C# 将字符串转换为十六进制,然后转换为字节数组

C# 将字符串转换为十六进制,然后转换为字节数组,c#,arrays,string,byte,C#,Arrays,String,Byte,所以, 我有一个字符串,我想将每个字符转换为十六进制值,然后将其放入字节数组中,通过com端口发送 我可以将单个字符转换为需要发送的十六进制,但无法将字符串数组正确地转换为字节数组 例如: string beforeConverting = "HELLO"; String[] afterConverting = {"0x48", "0x45", "0x4C", "0x4C", "0x4F"}; 应该成为 byte[] byteData = new byte[]{0x48, 0x45, 0x4

所以, 我有一个字符串,我想将每个字符转换为十六进制值,然后将其放入字节数组中,通过com端口发送

我可以将单个字符转换为需要发送的十六进制,但无法将字符串数组正确地转换为字节数组

例如:

string beforeConverting = "HELLO";

String[] afterConverting = {"0x48", "0x45", "0x4C", "0x4C", "0x4F"};
应该成为

byte[] byteData = new byte[]{0x48, 0x45, 0x4C, 0x4C, 0x4F};

我在几篇不同的文章中尝试了几种不同的方法,但我无法将这些方法正确地结合在一起。如果有人能给我指出正确的方向,或者给我一段示例代码,那就太棒了

如果您的最终目标是发送
byte[]
,那么您实际上可以跳过中间步骤,立即使用
Encoding.ASCII.GetBytes
string
转换为
byte[]
(前提是您发送ASCII字符):

如果不发送ASCII,则可以根据需要找到适当的编码类型(如Unicode或UTF32)

也就是说,如果您仍然希望将十六进制字符串转换为字节数组,可以执行以下操作:

/// <summary>
/// To convert Hex data string to bytes (i.e. 0x01455687)  given the data type
/// </summary>
/// <param name="hexString"></param>
/// <param name="dataType"></param>
/// <returns></returns>
public static byte[] HexStringToBytes(string hexString) {
  try {
    if (hexString.Length >= 3) //must have minimum of length of 3
      if (hexString[0] == '0' && (hexString[1] == 'x' || hexString[1] == 'X'))
        hexString = hexString.Substring(2);
    int dataSize = (hexString.Length - 1) / 2;
    int expectedStringLength = 2 * dataSize;
    while (hexString.Length < expectedStringLength)
      hexString = "0" + hexString; //zero padding in the front
    int NumberChars = hexString.Length / 2;
    byte[] bytes = new byte[NumberChars];
    using (var sr = new StringReader(hexString)) {
      for (int i = 0; i < NumberChars; i++)
        bytes[i] = Convert.ToByte(new string(new char[2] { (char)sr.Read(), (char)sr.Read() }), 16);
    }
    return bytes;
  } catch {
    return null;
  }
}
byte[] byteData = afterConverting.Select(x => HexStringToBytes(x)[0]).ToArray();
我上面提到的方法更通用,它可以处理输入
字符串
,比如
0x05163782
,以给出
字节[4]
。对于您的使用,您只需要获取第一个字节(因为
byte[]
始终是
byte[1]
),因此在
LINQ Select
中有
[0]
索引

上述自定义方法中使用的核心方法是
Convert.ToByte()


要仅将十六进制字符串转换为数字,可以使用如下类

string hex = "0x3B";
byte b = Convert.ToByte(hex.Substring(2), 16)
// b is now 0x3B

子字符串用于跳过字符
0x

是的,您发布的前两行非常有效!太感谢你了!在我看来你是个天才!伟大的很高兴知道!:)
bytes[i] = Convert.ToByte(new string(new char[2] { (char)sr.Read(), (char)sr.Read() }), 16);
string hex = "0x3B";
byte b = Convert.ToByte(hex.Substring(2), 16)
// b is now 0x3B