如何将int转换为hex并将hex写入文件?

2024-10-04 09:27:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在Python 2.7.13中执行以下操作:

  • 将int值转换为十六进制(58829405413336430应该变成d101085402656e
  • 在创建的hex中添加一个“payload”(简单的字符串,如c1234)
  • 十六进制写入文件

我的代码当前如下所示:

mime=58829405413336430
payload="c9999"

fw_file=open('testhex', 'wb')
fw_file.write("%x" % mime)
fw_file.write(str(payload).encode("hex"))
fw_file.close()

我得到了以下文件(在Debian上使用xxd):

^{pr2}$

这不是我需要的。我需要这样的文件:

xxd WORKING
00000000: d101 0854 0265 6e63 3939 3939            ...T.enc9999

我的理解是:

"%x" % mime将我的int转换为十六进制,但它是作为字符串写入的。encode做得很正确,但这对整数无效。我怎样才能避免这种行为并将“纯”十六进制写入我的文件?如果在python2中无法实现,我也可以使用python3。

因为这是我关于StackOverflow的第一个问题,请告诉我是否应该做些不同的事情。


Tags: 文件字符串代码encodefilewriteintpayload
1条回答
网友
1楼 · 发布于 2024-10-04 09:27:27

问题的一部分是"%x" % mime的结果是一对十六进制字符的字符串(在本例中是十六进制字符对)-"d101085402656e"的值,这就是写入文件的内容。然而,需要的是构成整数本身的实际字节值。在

在Python3中,这可以很容易地解决,方法是使用一个名为^{}的内置方法,该方法被添加到该版本中的int类型中,但在Python2.x中,必须用另一种方法来完成。在

由于使用了str(payload).encode("hex")也返回了一个十六进制字符串表示形式,而不是{}中已经存在的每个字符的实际字节值,这是需要的。幸运的是,在这种情况下,通过使用python2.x内置的^{}类可以很容易地完成需要完成的工作。在

下面是我写的一个版本,它是作为answer的一部分发布到相关的question的函数,该函数可以处理mime值的问题。在

在函数定义之后是代码,展示了在这种情况下如何使用它,以及bytearray类,以获得写入文件的正确二进制数据。在

def int_to_bytes(n, minlen=0):
    """ Convert integer to bytearray with optional minimum length. 
    """
    if n > 0:
        arr = []
        while n:
            n, rem = n >> 8, n & 0xff
            arr.append(rem)
        b = bytearray(reversed(arr))
    elif n == 0:
        b = bytearray(b'\x00')
    else:
        raise ValueError('Only non-negative values supported')

    if minlen > 0 and len(b) < minlen: # zero padding needed?
        b = (minlen-len(b)) * '\x00' + b
    return b

mime = 58829405413336430
payload = 'c9999'

with open('testhex', 'wb') as fw_file:
    fw_file.write(int_to_bytes(mime))
    fw_file.write(bytearray(payload))

下面是它生成的testhex文件内容的十六进制转储(使用python2.7.15):

^{pr2}$

相关问题 更多 >