复杂二进制分析-位翻转和写入二进制文件(Python)

复杂二进制分析-位翻转和写入二进制文件(Python),python,python-3.x,bit-manipulation,binaryfiles,Python,Python 3.x,Bit Manipulation,Binaryfiles,我有一个.bin文件,需要读入、翻转位并写回二进制文件。例如: RAW INPUT: \xdd\x00 = 1101110100000000 FINAL OUTPUT: \x00\xbb = 0000000010111011 RAW INPUT: \x33\x00 = 0011001100000000 FINAL OUTPUT: \x00\xcc = 0000000011001100 我在翻译过程中遇到了一些困难,其中一些字节将被翻译,而另一些则不会。在上面的示例中,我可以轻松地

我有一个.bin文件,需要读入、翻转位并写回二进制文件。例如:

RAW INPUT:    \xdd\x00 = 1101110100000000
FINAL OUTPUT: \x00\xbb = 0000000010111011

RAW INPUT:    \x33\x00 = 0011001100000000
FINAL OUTPUT: \x00\xcc = 0000000011001100
我在翻译过程中遇到了一些困难,其中一些字节将被翻译,而另一些则不会。在上面的示例中,我可以轻松地翻转二进制位并从\xdd\x00获取\x00\xbb,但转换不适用于\x33\00到\x00\xcc

我现在做的是一次读取1个字节,将其转换成整数,得到一个二进制值,翻转位,然后将其存储到一个新的二进制文件中

data = binary_file.read(1)
while data:
    bits = ord(data)                        # Integer Value
    binary = ("{0:b}".format(bits))         # Binary value of Integer
    flipped = 0
    while bits:
        flipped <<=1
        flipped += bits & 1
        bits >>= 1
    data = binary_file.read(1)
    tmp = bytes([flipped])
    output_file.write(tmp)
我得到的值不是我期望的值:

This method works on the following bytes:
Raw Data: \x00\x00\xdd\x00
Expected (Wanted) Value: \x00\x00\x00\xbb
Final Data: \x00\x00\x00\xbb

However, the method does not work on the following bytes:
Raw Data: \x00\x00\x33\x00
Expected (Wanted) Value:: \x00\x00\x00\xcc
Final Data: \x00\x00\x003
关于如何改进此过程并使其实际工作,有何想法


编辑1:

以下是我需要如何准确处理每个字节和最终产品的有效流程:

Hex Bytes (Raw Data)      44           88          22          0
Binary Representation   01000100    10001000    00100010    00000000
Reverse Binary Order    00100010    00010001    01000100    00000000
New Hex Bytes              22          11          44          00
Flip Hex bytes(Final Data) 11          22          00          44
下面是使用bytes\x00\x00\xdd\x00的另一个示例

Hex Bytes (Raw Data)       00          00          dd          00
Binary Representation   00000000    00000000    11011101    00000000
Reverse Binary Order    00000000    00000000    10111011    00000000
New Hex Bytes              00          00          bb          00
Flip Hex bytes(Final Data) 00          00          00          bb

你可以这样做:

with open('test.bin', 'rb') as f:
    data = f.read()

def reverse(b):
    return int('{:08b}'.format(b)[::-1], 2)

out = bytearray()   
for i in range(0, len(data), 2):
    out.extend((reverse(data[i+1]), reverse(data[i])))

with open('out.bin', 'wb') as f:
    f.write(out)

反转部分是从到

以澄清:是否要反转每对字节的位?您的文件是否总是包含偶数个字节?一个文件大概有多大?@thierrylahuille是的,我需要反转每对字节的位,并将它们写入一个新文件。最终文件大小接近21MB。这似乎无法在out.bin文件中提供正确的输出。例如,有些字节:\x00\x00\xbb\x11\x22\x00\x44是位和字节反转后所需的正确(预期值)。但是,out.bin文件中的数据如下:\x00\x00\x00\xdd\x88\x88\x00\x88请编辑您的问题,并包括一个简短的示例文件以及您期望的相应输出。上面的代码实现了您在问题中所期望的功能。例如,test.bin包含
00 DD 00 00 33 00
,out.bin包含
00 00 BB 00 00 CC
,这正是您的问题所期望的。我添加了一个编辑,显示了每个字节从头到尾需要经过的流程。原始数据就是这样,从二进制文件中拉入的数据和翻转的十六进制字节是我需要数据的最终结构。我检查了它,使用test.bin包含
44 88 22 00 00 DD 00
,我得到了.bin包含
11 22 00 44 00 BB
,这正是您所期望的。所以,这段代码做了它应该做的事情。你是对的,我在我的文件结构中做了一些更改,所以这对我来说是完全正确的。对不起,我跑来跑去,非常感谢你的帮助!
with open('test.bin', 'rb') as f:
    data = f.read()

def reverse(b):
    return int('{:08b}'.format(b)[::-1], 2)

out = bytearray()   
for i in range(0, len(data), 2):
    out.extend((reverse(data[i+1]), reverse(data[i])))

with open('out.bin', 'wb') as f:
    f.write(out)