C# 理解C语言中的十六进制和字节#

C# 理解C语言中的十六进制和字节#,c#,binary,hex,byte,C#,Binary,Hex,Byte,我似乎对在C#(或一般编程)中计算和使用十六进制和字节值缺乏基本的理解 我想知道如何从字符串和RGB颜色等源计算十六进制值和字节(0x-)(比如如何计算R255 G0 B0的0x代码?) 为什么我们要用FF之类的东西,它是为了补偿基数为10的系统得到一个像10这样的数字吗 十六进制是以16为基数的,所以我们不是从0到9计数,而是从0到F计数。我们通常用0x作为十六进制常量的前缀。因此, Hex-Dec ------------- 0x00=0 0x09=9 0x0A=10 0x0F=15 0x1

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

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


为什么我们要用FF之类的东西,它是为了补偿基数为10的系统得到一个像10这样的数字吗

十六进制是以16为基数的,所以我们不是从0到9计数,而是从0到F计数。我们通常用
0x
作为十六进制常量的前缀。因此,

Hex-Dec
-------------
0x00=0
0x09=9
0x0A=10
0x0F=15
0x10=16
0x200=512
字节是计算机上存储值的典型单位,在大多数现代系统中,字节包含8位。请注意,
实际上意味着
二进制数字
,因此,我们由此得出一个字节的最大值为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
>>>
>>>十六进制(a+b)
“0x42ab7”
>>>
>>>垃圾箱(a+b)
“0B100001010110111”
>>>
对于RGB示例,我可以演示如何使用来轻松计算这些值:

>>> R=66
>>> G=0
>>> B=248
>>>
>>> hex( R<<16 | G<<8 | B )
'0x4200f8'
>>>
>R=66
>>>G=0
>>>B=248
>>>
>>>十六进制(RBase-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
有了此表,您可以轻松地将任意长度的十六进制字符串转换为相应的位模式:

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

0010 1001 0100 0101 0100 1111 0101 1100 - 0x29454F5C

在十进制中,每个数字的权重是右边数字的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

对实际问题的答案已发布(“为什么我们使用FF之类的东西,是为了补偿以10为基数的系统吗?”)这是:计算机使用位,即1或0

其本质与Lee发布和调用的类似。在十进制数字中,数字中的每个位置都表示10的幂。例如,在数字123中,最后一个位置表示10^0——1。中间位置表示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个不同的值。如果您需要每个数字4位,您最好使用以16为基数的数字,而不是仅以10为基数。这就是十六进制的作用


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


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

hex很方便,因为你可以用4位来表示一个十六进制数字,所以一个字节(例如0xFF=11111111)可以用两个十六进制数字表示。在Windows中打开计算器>键入数字,从dec改为十六进制,再改为二进制,然后播放不同的数字