2016-04-15 73 views
2

因此, 我有一个字符串,我想将每个字符转换为十六进制值,然后把它放入一个字节数组通过COM端口发送。将字符串转换为十六进制然后到字节数组

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

例如:

string beforeConverting = "HELLO"; 

String[] afterConverting = {"0x48", "0x45", "0x4C", "0x4C", "0x4F"}; 

应该成为

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

我从几个不同的岗位尝试了几种不同的东西,但我不能得到的东西正确的结合在了一起。如果任何人都可以指向正确的方向,或给我一个很棒的示例代码片段!

回答

3

如果你的最终目的是送byte[],那么实际上你可以跳过中间步骤,并立即进行转换,从string使用Encoding.ASCII.GetBytesbyte[](前提是你送的ASCII字符):

string beforeConverting = "HELLO"; 
byte[] byteData = Encoding.ASCII.GetBytes(beforeConverting); 
//will give you {0x48, 0x45, 0x4C, 0x4C, 0x4F}; 

如果您不发送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(); 

我上面提到的方法是更一般的,它可以处理输入string0x05163782byte[4]。为了您的使用,您只需要取第一个字节(因为byte[]将始终为byte[1]),因此您在LINQ Select中有[0]索引。

在上面的自定义方法所使用的核心方法是Convert.ToByte()

bytes[i] = Convert.ToByte(new string(new char[2] { (char)sr.Read(), (char)sr.Read() }), 16); 
+0

是的,你发布的前两行很好用!不够感谢你!你是我心目中的天才! –

+0

太棒了。很高兴知道那件事! :) – Ian

1

要刚刚十六进制字符串转换为数字,你可以使用System.Convert类,像这样

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

子串用于跳过字符0x

相关问题