理解 C# 中的十六进制和字节
Posted
技术标签:
【中文标题】理解 C# 中的十六进制和字节【英文标题】:Understanding hexadecimals and bytes in C# 【发布时间】:2012-08-18 08:56:15 【问题描述】:我似乎对在 C#(或一般编程)中计算和使用十六进制和字节值缺乏基本的了解。
我想知道如何从字符串和 RGB 颜色等来源计算十六进制值和字节 (0x--)(比如我如何确定 R255 G0 B0 的 0x 代码是什么?)
我们为什么要用FF之类的东西,是为了补偿以10为底的系统得到10之类的数字吗?
【问题讨论】:
十六进制很方便,因为您可以用 4 位表示单个十六进制数字,因此可以用两个十六进制数字表示一个字节(例如 0xFF = 11111111)。 在 Windows 中打开计算器 > 输入数字并从 dec 更改为 hex 到 binary 并玩不同的数字 【参考方案1】:十六进制是以 16 为基数的,所以我们不是从 0 到 9,而是从 0 到 F。我们通常在十六进制常量前面加上 0x
。因此,
Hex Dec
-------------
0x00 = 0
0x09 = 9
0x0A = 10
0x0F = 15
0x10 = 16
0x200 = 512
一个字节是计算机上值的典型存储单位,在大多数现代系统上,一个字节包含 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)
对于我的十六进制计算,我喜欢使用 python 作为我的计算器:
>>> a = 0x427FB
>>> b = 700
>>> a + b
273079
>>>
>>> hex(a + b)
'0x42ab7'
>>>
>>> bin(a + b)
'0b1000010101010110111'
>>>
对于 RGB 示例,我可以演示如何使用 bit-shifting 轻松计算这些值:
>>> R=66
>>> G=0
>>> B=248
>>>
>>> hex( R<<16 | G<<8 | B )
'0x4200f8'
>>>
【讨论】:
【参考方案2】:Base-16(也称为 hex)表示法很方便,因为您可以在一个十六进制数字中放置四位,这使得转换为二进制非常容易,但不需要像完整的那样多的空间二进制表示法。当您需要以人类可读的形式表示面向位的数据时,这很有用。
学习十六进制很容易 - 您只需记住一个包含 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
有了这个表,你可以轻松地将任意长度的十六进制字符串转换成对应的位模式:
0x478FD105 - 01000111100011111011000100000101
转换回来也很容易:将二进制数字按四分组,然后使用表格生成十六进制数字
0010 1001 0100 0101 0100 1111 0101 1100 - 0x29454F5C
【讨论】:
【参考方案3】:在十进制中,每个数字的权重是右边数字的 10 倍,例如 32 中的“3”是 3 * 10,而 102 中的“1”是 1 * 100。二进制是相似的,除了因为只有两位数(0 和 1),每一位的权重仅是右边一位的两倍。十六进制使用 16 位 - 10 位十进制数字以及字母 A = 10 到 F = 15。
一个 n 位十进制数可以表示高达 10^n - 1 的值,同样,一个 n 位二进制数可以表示高达 2^n - 1 的值。
十六进制很方便,因为您可以用 4 位表示单个十六进制数字,因为 2^4 = 16 个可能的值可以用 4 位表示。
您可以通过一次从右 4 位分组并将每个组转换为相应的十六进制来将二进制转换为十六进制。例如 1011100 -> (101)(1100) -> 5C
从十六进制到二进制的转换更加简单,因为您可以简单地将每个十六进制数字扩展为相应的二进制,例如 0xA4 -> 1010 0100
【讨论】:
【参考方案4】:发布的实际问题的答案(“为什么我们使用 FF 之类的东西,是为了补偿以 10 为基数的系统以获得像 10 这样的数字?”)是这样的:计算机使用位,这意味着 1 或0.
本质类似于李发布并称为"positional notation"的内容。在十进制数中,数字中的每个位置指的是 10 的幂。例如,在数字 123 中,最后一个位置表示 10^0 - 那些。中间位置代表 10^1 - 十位。第一个是 10^2——数百个。所以数字“123”代表1 * 100 + 2 * 10 + 3 * 1 = 123。
二进制中的数字使用相同的系统。数字 10(以 2 为底)表示 1 * 2^1 + 0 * 2^0 = 2。
如果你想用二进制表示十进制数 10,你会得到数字 1010。也就是说,你需要四位来表示一个十进制数字。
但是使用 4 位,您最多可以表示 16 个不同的值,而不仅仅是 10 个不同的值。如果您需要每个数字四位,则最好使用以 16 为基数的数字,而不是仅以 10 为基数。这就是十六进制发挥作用的地方。
关于如何转换 ARGB 值;正如其他回复中所写,二进制和十六进制之间的转换相对容易(4 个二进制数字 = 1 个十六进制数字)。
十进制和十六进制之间的转换涉及更多,至少对我来说,首先将十进制转换为二进制表示,然后将二进制数转换为十六进制更容易(如果我必须在脑海中进行)。谷歌可能有大量的方法和算法。
【讨论】:
以上是关于理解 C# 中的十六进制和字节的主要内容,如果未能解决你的问题,请参考以下文章