我发现这个方法在msdn论坛上将字节数组转换为十六进制字符串。代码工作正常,但我有问题理解部分代码。这是将字节数组转换为十六进制字符串的代码。
private static string HexStr(byte[] p) {
char[] c = new char[p.Length * 2 + 2 ]; //reason for +2 is for 0x; can be removed
byte b;
c[0] = '0';c[1] = 'x'; //can be removed
for (int y = 0, x = 2; y < p.Length; ++y, ++x) // x = 0 if remove
{
b = ((byte)(p[y] >> 4));
c[x] = (char)(b > 9 ? b + 0x37 : b + 0x30); ///Why 0x37 and 0x30?
b = ((byte)(p[y] & 0xF));
c[++x] = (char)(b > 9 ? b + 0x37 : b + 0x30);///Here too?
}
return new string(c);
}
为什么当b大于9时,字节b加上0x37,否则加上0x30?快速谷歌搜索后,我发现的唯一信息是字节0x37 =十进制55 =字符&#39; 0&#39;和字节0x30 =十进制48 = char&#39; 0&#39;。有人可以向我解释一下吗? 提前谢谢。
答案 0 :(得分:1)
将表达式重写为:
char ch = (char)(b > 9 ? b + 'A' - 10 : b + '0');
它会变得清晰!
&#39; A&#39; == 0x41,&#39; A&#39; - 10 == 0x37,&#39; 0&#39; == 0x30
如果b <= 9
,那么b + '0'
==您需要的数字(请注意我认为更多&#34;人类可读&#34;写'0' + b
...你从字符'0'
开始并在Unicode表中提前b
个位置),如果b >= 10
,则必须选择一个字母AF,将'A'
添加到您的数字{ {1}}但减去10(因为b
是&#34;零&#34;在'A'
范围内......以人类可读的形式,它将是A-F
。
请注意,还有另一种编写表达式的方法,通常更容易(但完全不同的算法 - wyse)
'A' + (b - 10)