Como calcular a diferença entre dois offsets hexadecimais?

1

Eu tenho procurado como fazer isso, mas não encontrei o caminho para isso. Existe outra maneira de calcular essa diferença em vez de contar um por um?

Por exemplo:

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

0x7fffffffdbe0 - 0x7fffffffda98 = ????

Para entender esses resultados, vamos supor que abrimos um arquivo com um editor hexadecimal e temos os seguintes números hexadecimais: 8A B7 00 00 FF, com seus deslocamentos hexadecimais correspondentes: 0x7fffffffe066 0x7fffffffe067 0x7fffffffe068 0x7fffffffe069 0x7fffffffe070. A diferença dos offsets hexadecimais dos números 8A e FF é 0x04 porque diferem em 4 posições.

    
por user3358218 28.10.2016 / 22:30

2 respostas

4

screenshot of a comment

Os "offsets hex" são apenas números comuns e não possuem regras especiais para subtração. Você só obtém resultados diferentes porque sua entrada está errada:

we have the following hex numbers: 8A B7 00 00 FF, with their corresponding hex offsets: 0x7fffffffe066 0x7fffffffe067 0x7fffffffe068 0x7fffffffe069 0x7fffffffe070. The difference of the hex offsets of the numbers 8A and FF is 0x04 because they differ in 4 positions.

Em hexadecimal, 0x9 é primeiro seguido por 0xA, 0xB, 0xC, 0xD, 0xE, 0xF e somente então por 0x10. Portanto, se você tiver 5 bytes contíguos e o quarto estiver em 0x7FFF'FFFF'E069, o seguinte será em 0x7FFF'FFFF ' E06A , não 0x7FFF'FFFF' E070.

Em outras palavras, 0x…E070 - 0x…E066 = 0xA é o resultado correto.

    
por 28.10.2016 / 22:48
1

Não tenho certeza, mas talvez a questão seja como calcular a diferença manualmente?

Você pode calcular a diferença de A-B reescrevendo-a em acréscimos. Você faria isso primeiro invertendo / invertendo todos os bits de B e adicionando esse valor a A. Em seguida, você incrementa o resultado por 1 e ajusta (estreito) o resultado para ter o mesmo número de dígitos (ou bits) que os operandos originais foram.

Demonstração com valores hexadecimais da pergunta dele:

vamos calcular 0x7fffffffe070 - 0x7fffffffe066:

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

E agora vamos calcular 0x7fffffffe066 - 0x7fffffffe070:

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

É fácil inverter todos os bits em um dígito hexadecimal assim que você souber:

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

E assim por diante ...

    
por 29.10.2016 / 00:09

Tags