十六进制到整数格式的字符数组

本文关键字:字符 数组 格式 整数 十六进制 | 更新日期: 2023-09-27 18:08:34

我有一个API,它通过网络返回一个字节[],表示有关设备的信息。

其格式为15ab1234cd''r''n,其中前2个字符是消息中数据量的十六进制表示。

我知道我可以通过ASCIIEncoding.ASCII.GetString将其转换为字符串,然后使用Convert.ToInt32(string.Substring(0, 2), 16)来实现这一点。然而,在我编写的整个程序的整个生命周期中,整个东西都是一个字节数组,我不想仅仅为了获得数据包长度而转换为字符串。

有没有建议在C#中将十六进制格式的字符数组转换为int?

十六进制到整数格式的字符数组

没有。Net提供了执行此操作的函数。使用Encoding将前2个字节转换为字符串。GetString可读性很强(可能不是最具性能的(:

 var hexValue = ASCIIEncoding.ASCII.GetString(byteData, 0, 2);
 var intValue = Convert.ToInt32(hexValue, 16);

您可以很容易地编写转换代码(将'0'-'9''a'-'f'/'A'-'F'范围映射到相应的整数值并相加。

这里有一个语句转换严格用于娱乐目的。得到的lambda(在示例中((byte)'0',(byte)'A')之前(采用2字节参数,假设它们是ASCII字符并转换为integer.

((Func<Func<char,int>, Func<byte, byte, int>>)
    (charToInt=> (c, c1)=> 
       charToInt(char.ToUpper((char)c)) * 16 + charToInt(char.ToUpper((char)c1))))
  ((Func<char, int>)(
      c => c >= '0' && c <='9' ? c-'0' : c >='A' && c <= 'F' ? c - 'A' + 10 : 0))
 ((byte)'0',(byte)'A')

如果您知道前两个值是有效的十六进制字符(0-9、A-Z、A-Z(,则可以使用逻辑运算符转换为十六进制值。

int GetIntFromHexBytes(byte[] s, int start, int length)
{
   int ret = 0;
   for (int i = start; i < start+length; i++)
   {
      ret <<= 4;
      ret |= (byte)((s[i] & 0x0f) + ((s[i] & 0x40) >> 6) * 9);
   }
   return ret;
}

(这是因为c & 0x0f返回4个最低有效位,值"0"-"9"的范围为0-9,大写和小写字母("a"-"z"answers"a"-"z"(的范围为1-6。s[i] & 0x40对于数字字符为0,对于字母字符为0x40;向右移动六个字符为数字字符提供值0,为字母字符提供值1。向左移动并乘以9将为阿尔法字符增加9的偏差,以将a-F和a-F从1-6映射到10-15。(

给定字节数组:

byte[] b = { (byte)'7', (byte)'f', (byte)'1', (byte)'c' };

调用GetIntFromHexBytes(b, 0, 2)将根据需要返回127(0x7f(,即数组的前两个字节。

注意:这种方法不进行边界检查。如果需要,可以在循环中添加一个检查,以确保输入字节是有效的十六进制字符。