gpt4 book ai didi

python文字二进制到十六进制的转换

转载 作者:太空宇宙 更新时间:2023-11-04 01:31:01 25 4
gpt4 key购买 nike

我有一个包含一系列位的文本文件,采用 ascii 格式:

cat myFile.txt
0101111011100011001...

我想以二进制模式将其写入另一个文件,以便我可以在十六进制编辑器中读取它。我怎样才能做到这一点?我已经尝试使用如下代码对其进行转换:

f2=open(fileOut, 'wb')
with open(fileIn) as f:
while True:
c = f.read(1)
byte = byte+str(c)
if not c:
print "End of file"
break
if count % 8 is 0:
count = 0
print hex(int(byte,2))
try:
f2.write('\\x'+hex(int(byte,2))[2:]).zfill(2)
except:
pass
byte = ''
count += 1

但这并没有实现我计划做的事情。你有什么提示吗?

最佳答案

  • 一次读取和写入一个字节非常慢。只需在每次调用 f.readf.write 时从文件中读取更多数据,您就可以将代码加速大约 45 倍:

    |------------------+--------------------|
    | using_loop_20480 | 8.34 msec per loop |
    | using_loop_8 | 354 msec per loop |
    |------------------+--------------------|

    using_loop 是本文底部显示的代码。 using_loop_20480是chunksize = 1024*20的代码。这意味着一次从文件中读取 20480 个字节。 using_loop_1 与 chunksize = 1 的代码相同。

  • 关于count % 8 is 0:不要使用is来比较数值;使用 == 代替。以下是为什么 is 可能会给您错误结果的一些示例(可能不在您发布的代码中,但一般来说,is 在这里不合适):<​​/p>

    In [5]: 1L is 1
    Out[5]: False

    In [6]: 1L == 1
    Out[6]: True

    In [7]: 0.0 is 0
    Out[7]: False

    In [8]: 0.0 == 0
    Out[8]: True
  • 代替

    struct.pack('{n}B'.format(n = len(bytes)), *bytes)

    你可以用

    bytearray(bytes)

    不仅打字更少,而且速度也稍微快一些。

    |------------------------------+--------------------|
    | using_loop_20480 | 8.34 msec per loop |
    | using_loop_with_struct_20480 | 8.59 msec per loop |
    |------------------------------+--------------------|

    bytearrays非常适合这份工作,因为它弥合了将数据视为字符串和将其视为序列之间的差距数。

    In [16]: bytearray([97,98,99])
    Out[16]: bytearray(b'abc')

    In [17]: print(bytearray([97,98,99]))
    abc

    正如您在上面看到的,bytearray(bytes) 允许您通过传递一个整数序列来定义字节数组(在range(256)), 并且允许你把它写出来就好像它是一个字符串:g.write(bytearray(bytes))


def using_loop(output, chunksize):
with open(filename, 'r') as f, open(output, 'wb') as g:
while True:
chunk = f.read(chunksize)
if chunk == '':
break
bytes = [int(chunk[i:i+8], 2)
for i in range(0, len(chunk), 8)]
g.write(bytearray(bytes))

确保 block 大小是 8 的倍数。


这是我用来创建表格的代码。注意 prettytable也做了类似的事情,建议使用他们的代码而不是我的 hack:table.py

这是我用来计时代码的模块:utils_timeit.py . (它使用 table.py)。

这是我用来计时的代码 using_loop(和其他变体):timeit_bytearray_vs_struct.py

关于python文字二进制到十六进制的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13932893/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com