在Windows中的Python 3中编写原始二进制字节的十六进制转储

时间:2015-06-17 16:35:32

标签: python

我正在尝试从任意文件中读取指定数量的字节,并将其作为字节串输出。现在我只是想输出到stdout,但最终我想要一个字节串,我可以进行字节级比较。问题是我不能为我的生活让Python输出原始二进制值而不将它们解释为ASCII。

这是我的代码。

import sys, os, msvcrt

msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)

bde_file_offset = int(sys.argv[1])
bde_file_numbytes = int(sys.argv[2])

for x in range(3, len(sys.argv)):
  bde_file = open(str(sys.argv[x]),"rb")
  bde_file.seek(bde_file_offset)
  bde_file_bytestring = bde_file.read(bde_file_numbytes)
  sys.stdout.buffer.write(bde_file_bytestring)
  bde_file.close()

我在询问之前对这个问题进行了一些研究,我找到了三个可能的解决方案,但没有一个有效。我试图用-u运行Python解释器。我试过使用这个msvcrt.setmode函数,我尝试使用sys.stdout.buffer.write。我甚至一次尝试了所有这些!什么都行不通。

我正在使用的测试文件是带有ABCDEFG的文本文件。我不希望它输出ABCDEFG,我希望它输出41 42 43 44 45 46 47,就像十六进制编辑器中的二进制视图一样。我怎样才能做到这一点?感谢。

2 个答案:

答案 0 :(得分:0)

我不认为你使用的词语意味着你认为它们的含义:P

你确实看到了原始字节字符串...如果你的终端知道如何渲染一个字节,那么......你要求的是ascii十六进制转储。

def hex_dump(my_string):
    return " ".join(map("{0:0>2X}".format,map(ord,my_string)))

my_string = "ABCDE"
print(hex_dump(my_string))

如果您只想要ord内部值

ordinal_values = map(ord,my_string)

答案 1 :(得分:0)

好的,所以我最初的问题措辞很差。我真正想要的是从文件读取任意字节并打印出表示这些字节的十六进制值列表。这是非常困难的,并且执行它的代码非常难看,但它确实有效。这是完成我想要它做的最终代码。

import sys

bde_file_offset = int(sys.argv[1])
bde_file_numbytes = int(sys.argv[2])

for x in range(3, len(sys.argv)):
  bde_file = open(str(sys.argv[x]),"rb")
  bde_file.seek(bde_file_offset)
  bde_file_bytestring = bde_file.read(bde_file_numbytes)
  bde_file_outputstring = " ".join("{:02x}".format(c) for c in bde_file_bytestring)
  print(bde_file_outputstring)
  bde_file.close()