了解C#中的十六进制和字节

Dan*_*aar 6 c# binary hex byte

我似乎缺乏对在C#(或一般编程)中计算和使用十六进制和字节值的有趣理解.

我想知道如何从字符串和RGB颜色等来源计算十六进制值和字节(0x--)(比如我如何计算出R255 G0 B0的0x代码是什么?)

为什么我们使用像FF这样的东西,它是否能够补偿基数为10的系统得到像10这样的数字?

Jon*_*art 16

十六进制是16的基数,因此我们不是从0到9计数,而是从0到F计数.我们通常将十六进制常量加上前缀0x.从而,

Hex      Dec
-------------
0x00  =  0
0x09  =  9
0x0A  =  10
0x0F  =  15
0x10  =  16
0x200 =  512
Run Code Online (Sandbox Code Playgroud)

字节是计算机上值的典型存储单位,在大多数现代系统中,一个字节包含8位.注意,bit实际上意味着binary digit,因此,我们收集一个字节的最大值为11111111二进制.即0xFF十六进制或255十进制.因此,一个字节可以由最少两个十六进制字符表示.一个典型的4字节int是8个十六进制字符,如0xDEADBEEF.

RGB值通常用3个字节值打包,按顺序为RGB.从而,

R=255 G=0 B=0    =>  R=0xFF G=0x00 B=0x00  =>  0xFF0000  or #FF0000 (html)
R=66  G=0 B=248  =>  R=0x42 G=0x00 B=0xF8  =>  0x4200F8  or #4200F8 (html)
Run Code Online (Sandbox Code Playgroud)

对于我的十六进制计算,我喜欢使用python作为我的计算器:

>>> a = 0x427FB
>>> b = 700
>>> a + b
273079
>>>
>>> hex(a + b)
'0x42ab7'
>>>
>>> bin(a + b)
'0b1000010101010110111'
>>>
Run Code Online (Sandbox Code Playgroud)

对于RGB示例,我可以演示如何使用位移来轻松计算这些值:

>>> R=66
>>> G=0
>>> B=248
>>>
>>> hex( R<<16 | G<<8 | B )
'0x4200f8'
>>>
Run Code Online (Sandbox Code Playgroud)


das*_*ght 7

Base-16(也称为十六进制)表示法很方便,因为您可以将四个位恰好放入一个十六进制数字中,从而使转换为二进制非常容易,但不需要与完整二进制表示法一样多的空间。当您需要以人类可读的形式表示面向位的数据时,这非常有用。

学习十六进制很容易 - 您所需要做的就是记住一个定义十六进制到二进制转换的 16 行短表:

0 - 0000
1 - 0001
2 - 0010
3 - 0011
4 - 0100
5 - 0101
6 - 0110
7 - 0111
8 - 1000
9 - 1001
A - 1010
B - 1011
C - 1100
D - 1101
E - 1110
F - 1111
Run Code Online (Sandbox Code Playgroud)

有了这张表,您可以轻松地将任意长度的十六进制字符串转换为其相应的位模式:

0x478FD105 - 01000111100011111011000100000101 
Run Code Online (Sandbox Code Playgroud)

转换回来也很容易:将二进制数字按四分组,然后使用表格生成十六进制数字

0010 1001 0100 0101 0100 1111 0101 1100 - 0x29454F5C
Run Code Online (Sandbox Code Playgroud)