为什么一个字节加上0x37而true和0x30,而在这个字节数组中为false,在C#中为十六进制字符串转换?

时间:2017-03-23 11:24:01

标签: c# arrays string hex byte

我发现这个方法在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;。有人可以向我解释一下吗? 提前谢谢。

1 个答案:

答案 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)