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

时间:2012-08-22 21:15:49

标签: c# binary hex byte

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

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

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

4 个答案:

答案 0 :(得分:13)

十六进制是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'
>>>

答案 1 :(得分:3)

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

答案 2 :(得分:1)

在十进制中,每个数字的权重比右边的数字多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 - &gt; (101)(1100) - &gt;图5C

从十六进制到二进制的转换甚至更简单,因为您可以简单地将每个十六进制数字扩展为相应的二进制数,例如0xA4 - &gt; 1010 0100

答案 3 :(得分:1)

发布实际问题的答案(“为什么我们使用FF这样的东西,是否要补偿基数为10的系统得到像10这样的数字?”)是这样的:计算机使用位,这意味着1或者0

本质与Lee发布并称为"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.这意味着,您需要四位来表示单个十进制数字。

但是使用四位,您可以表示多达16个不同的值,而不仅仅是10个不同的值。如果你需要每位四位,你也可以使用基数为16而不是只有10位数。这就是十六进制发挥作用的地方。


关于如何转换ARGB值;正如在其他回复中所写,在二进制和十六进制之间进行转换相对容易(4个二进制数字= 1个十六进制数字)。

十进制和十六进制之间的转换更为复杂,至少对我来说,更容易(如果我必须在头脑中)首先将十进制转换为二进制表示,然后将二进制数转换为十六进制。谷歌可能有大量的方法和算法。