如何计算两个十六进制偏移之间的差值?

如何计算两个十六进制偏移之间的差值?

我一直在寻找如何做到这一点,但我还没有找到方法。除了逐个计算之外,还有其他方法可以计算这个差异吗?

例如:

0x7fffffffe070 - 0x7fffffffe066 = 0x04
0x7fffffffe066 - 0x7fffffffe070  = -0x04

0x7fffffffdbe0 - 0x7fffffffda98 = ????

为了理解这些结果,假设我们使用十六进制编辑器打开一个文件,并且有以下十六进制数字:8A B7 00 00 FF,其对应的十六进制偏移量为:0x7fffffffe066 0x7fffffffe067 0x7fffffffe068 0x7fffffffe069 0x7fffffffe070。数字 8A 和 FF 的十六进制偏移量之差为 0x04,因为它们有 4 个位置不同。

答案1

评论截图

“十六进制偏移量”只是普通数字,没有特殊的减法规则。你得到不同的结果只是因为你的输入是错的:

我们有以下十六进制数:8A B7 00 00 FF,其对应的十六进制偏移量为:0x7fffffffe066 0x7fffffffe067 0x7fffffffe068 0x7fffffffe069 0x7fffffffe070。8A 和 FF 的十六进制偏移量之差为 0x04,因为它们有 4 个位置不同。

在十六进制中,0x9 首先后面跟着 0xA、0xB、0xC、0xD、0xE、0xF,只有那时0x10。因此,如果您有 5 个连续的字节,并且第四个字节位于 0x7FFF'FFFF'E069,则下一个字节将位于 0x7FFF'FFFF'E06A不是0x7FFF'FFFF'E070。

换句话说,0x…E070 - 0x…E066 = 0xA其实是正确的结果。

答案2

我不确定,但也许问题是如何手工计算差异?

您可以通过将其重写为加法来计算 AB 的差值。您可以先翻转/反转 B 中的所有位,然后将该值添加到 A。接下来,您将结果增加 1,并将结果修剪(缩小)为与原始操作数一样多的数字(或位数)。

使用来自他的问题的十六进制值的演示:

让我们计算一下 0x7fffffffe070 - 0x7fffffffe066:

 7fffffffe070  
 800000001f99 +  (this is 0x7fffffffe066 with all bits inverted)
===============
1000000000009
            1 +
===============
            A (or 10 decimal, or +0xa if you will)

现在让我们计算 0x7fffffffe066 - 0x7fffffffe070:

7fffffffe066
800000001f8f +   (this is 0x7fffffffe070 with all bits inverted)
==============
fffffffffff5
           1 +
==============
fffffffffff6  (or -10 decimal / -0xa)

一旦知道以下内容,就很容易翻转十六进制数字中的所有位:

0 = F  (or 0000 ==> 1111)
1 = E  (or 0001 ==> 1110)
2 = D 
...
F = 0  (or 1111 ==> 0000)

等等...

相关内容