十六进制到整数格式的字符数组
本文关键字:字符 数组 格式 整数 十六进制 | 更新日期: 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(,即数组的前两个字节。
注意:这种方法不进行边界检查。如果需要,可以在循环中添加一个检查,以确保输入字节是有效的十六进制字符。