超过 FF 的整数值的十六进制表示 (255)

逆向工程 数据库
2021-07-08 10:56:31

我正在学习一些 gdb,它涵盖了检查数组。有以下代码,我看到它是4个字节,以及如何a[1] = 2在数组中int a[] = {1,2,3}

(gdb) x/4xb a + 1
0x7fff5fbff570: 0x02  0x00  0x00  0x00

但是如果 a 大于单个十六进制字节所能显示的值呢?那么第二部分的效果如何呢?对不起,如果这不清楚,我不知道如何准确地拖拽它。

2个回答

我想你在这里有两个问题。第一部分是如何从十进制转换为十六进制并返回;第二部分是如何在内存中表示多字节值。Guntram Blohm 的回答详细涵盖了第一部分,我将尝试在这里对第二部分的回答进行模糊处理。

因此,考虑一个多字节十六进制数...ABCD,其中每个字母代表一个字节。所以例如在 0x03B87C43 中,A 代表 0x03,B 代表 0xB8,C 代表 7C,D 代表 0x43。最后,D 被称为低位字节。

现在,各种字节可以在内存中以不同的方式排列;目前使用的主要形式有两种:

小端形式:

低位字节放置在最低的内存地址,因此我们的示例编号将因此存储在内存中:

 1000  1001  1002  1003   <----- memory addresses, notional     
+-----+-----+-----+-----+
|  D  |  C  |  B  |  A  |
+-----+-----+-----+-----+

Intel 处理器使用这种存储多字节数字的形式。

大端形式:

低位字节放置在最高内存地址,因此我们的示例编号将因此存储在内存中:

 1000  1001  1002  1003   <----- memory addresses, notional     
+-----+-----+-----+-----+
|  A  |  B  |  C  |  D  |
+-----+-----+-----+-----+

非英特尔 SUN 工作站使用这种形式(IIRC 他们使用摩托罗拉处理器)。

其他形式。

几乎可以使用任何其他安排。例如,PDP-11 使用的系统以小端格式存储 32 位值,除了交换 16 位一半的每个字节。因此,我们的样本编号将存储在内存中:

 1000  1001  1002  1003   <----- memory addresses, notional     
+-----+-----+-----+-----+
|  C  |  D  |  A  |  B  |
+-----+-----+-----+-----+

希望这个对你有帮助。

另一条评论太长了......您想将十进制转换为十六进制,反之亦然?

非常简短的回答:使用 windows calc,切换到程序员模式。

长一点的答案:得到一个可以做十六进制的计算器,或者一个可以做它的计算器应用程序。我更喜欢 android 上的 realcalc。

长答案:

要将十进制转换为十六进制,请将您的数字除以 16 并将余数记为十六进制数字。用被分割的数字重复,在你已经写下的数字前面加上数字。继续直到达到零。如果您想要字节,则将其分组为 2。

例子:

1_000_000 / 16 = 62_500, remainder 0 => 0
62_500 / 16 = 3_906, remainder 4 => 40
3_906 / 16 = 244. remainder 2 => 240
244 / 16 = 15, remainder 4 => 4240
15 / 16 = 0, remainder 15 => F4240, or 0F 42 40 in big endian, or 40 42 0F little endian.

要将十六进制转换为十进制,请取最左边的数字。乘以16,加上下一位。重复(相乘、相加)直到没有数字为止。

F4240 => 15
4240  => 15*16+4 = 244
240   => 244*16+2 = 3_906
40    => 3_906*16+4 = 62_450
0     => 62_450*16+0 = 1_000_000

如果你想以字节而不是数字来做同样的事情,它是一样的,但乘数是 256。字节 0x0f、0x42、0x40 的值为 15、66 和 64。

F 42 40 => 15
42 40   => 15*256+66 = 3_906
40      => 3_906*256+64 = 1_000_000