如何将ASCII字节文件写入二进制文件作为实际字节?

时间:2011-09-30 23:59:57

标签: python hex ascii

尝试做MD5碰撞作业问题,我不知道如何在Python中编写原始字节。我给了它一个镜头,但最后得到一个带有ASCII的.bin文件。这是我的代码:

fileWriteObject1 = open("md5One.bin", 'wb')
fileWriteObject2 = open("md5Two.bin", 'wb')
fileReadObject1 = open('bytes1.txt', 'r')
fileReadObject2 = open('bytes2.txt', 'r')

bytes1Contents = fileReadObject1.readlines()
bytes2Contents = fileReadObject2.readlines()

fileReadObject1.close()
fileReadObject2.close()


for bytes in bytes1Contents:
    toWrite = r"\x" + bytes
    fileWriteObject1.write(toWrite.strip()) 

for bytes in bytes2Contents:
    toWrite = r"\x" + bytes
    fileWriteObject2.write((toWrite.strip())

fileWriteObject1.close()
fileWriteObject2.close()

示例输入:                 D1                 31                 DD                 02                 C5                 E6                 EE                 C4                 69                 3D                 9A                 06                 98                 AF                 F9                 5C                 2F                 CA                 B5

我有一个指向我的输入文件的链接,但似乎一个mod删除了它。它是一个文件,每行都有一个用ASCII写的十六进制字节。

编辑:解决了!感谢Circumflex。

我有两个不同的文本文件,每个文件有128个字节的ASCII。我将它们转换为二进制文件并使用struck.pack编写它们并得到MD5碰撞。

2 个答案:

答案 0 :(得分:4)

如果要将它们写为原始字节,可以使用pack()类型的struct方法。

您可以将MD5写为2长的整数,但是您必须将它写成2个8字节的部分

http://docs.python.org/library/struct.html

编辑:

一个例子:

import struct

bytes = "6F"
byteAsInt = int(bytes, 16)
packedString = struct.pack('B', byteAsInt)

如果我说得对,你试图用一些十六进制字符串写入一些文本,将它们转换成二进制格式并输出它们?如果是这种情况,该代码应该做你想要的。

它基本上将原始十六进制字符串转换为int,然后以二进制形式(作为字节)将其打包成字符串。

你可以为输入字符串

中的每个字节循环这样的事情

答案 1 :(得分:0)

>>> import binascii
>>> binary = binascii.unhexlify("d131dd02c5")
>>> binary
'\xd11\xdd\x02\xc5'

binascii.unhexlify()binascii.c中定义。这是Python中的“接近C”实现:

def binascii_unhexlify(ascii_string_with_hex):
    arglen = len(ascii_string_with_hex) 
    if arglen % 2 != 0:
       raise TypeError("Odd-length string")

    retval = bytearray(arglen//2)
    for j, i in enumerate(xrange(0, arglen, 2)):
        top = to_int(ascii_string_with_hex[i])
        bot = to_int(ascii_string_with_hex[i+1])
        if top == -1 or bot == -1:
           raise TypeError("Non-hexadecimal digit found")
        retval[j] = (top << 4) + bot

    return bytes(retval)

def to_int(c):
    assert len(c) == 1
    return "0123456789abcdef".find(c.lower())

如果没有binascii.unhexlify()bytearray.fromhex()str.decode('hex')或类似内容,您可以按如下方式编写:

def unhexlify(s, table={"%02x" % i: chr(i) for i in range(0x100)}):
    if len(s) % 2 != 0: 
        raise TypeError("Odd-length string")
    try:
        return ''.join(table[top+bot] for top, bot in zip(*[iter(s.lower())]*2))
    except KeyError, e:
        raise TypeError("Non-hexadecimal digit found: %s" % e)