将字节作为字符串转换为实际的字节类型
Converting byte as a string into actual byte type
我正在 python 使用霍夫曼编码和解码算法创建一个压缩项目。我必须创建一个更小的文件。我正在使用从霍夫曼树中获取的字节值,并将它们作为字符串文字写入文件,如“0100101”我想转换这些相同的数字,以便它存储为二进制数。
假设 'binary number' 你指的是整数:
>>> int('0100101', 2)
37
使用内置的 int
函数以 2
为基数将字符串简单地转换为整数。
请参阅下面的代码,了解如何将表示存储在一个文件中的二进制值的字符串列表作为字节写入另一个文件。请注意,两种变体(已使用的和已取消注释的变体)都会为您提供相同的结果。
# lstStrBin = ['01001010','10100101','01001011']
lstStrBin = open("binaryToByteString_Cg.txt").readlines()
# byteArr = bytearray([int(strBin, 2) for strBin in lstStrBin])
bytesString = bytes([int(strBin, 2) for strBin in lstStrBin])
# print(byteArr) gives: bytearray(b'J\xa5K')
with open('binaryToByteString_Cg.bin', "wb") as f:
# f.write(byteArr)
f.write(bytesString)
binaryToBytes.bin
的内容(3个字节长,在SciTE中显示)是:
就这样吧?
P.S。这里 binariesFile.txt 的内容:
01001010
10100101
01001011
ADDENDUM (2017-04-25)
:
根据 OP 的请求(见评论),我在下面提供了两种转换方式的两部分代码。代码读取一个 .txt
文件,其中包含 01010101
行,写入一个二进制文件 .bin-fromTxt
,.txt
文件中的每一行都有一个字节,然后读取 .bin-fromTxt
文件,并写入包含 01010101
行的 .txt-fromBin
文件。
在该过程结束时,.txt-fromBin
文件将具有与 .txt
文件相同的内容,表明来回转换成功。
with open('binaryToByteString_Cg.txt') as f_txt:
bytesString = bytes([int(strBin, 2) for strBin in f_txt.readlines()])
with open('binaryToByteString_Cg.bin-fromTxt', "wb") as f_bin:
f_bin.write(bytesString)
with open('binaryToByteString_Cg.bin-fromTxt', "rb") as f_bin:
bytesString = f_bin.read()
with open('binaryToByteString_Cg.txt-fromBin', "w") as f_txt:
for byte in bytesString:
f_txt.write( "{0:{fill}8b}\n".format(byte, fill='0'))
如果 binaryToByteString_Cg.txt
文件包含:
01010101
10101010
00001111
binaryToByteString_Cg.bin-fromTxt
文件包含:
最后的 binaryToByteString_Cg.txt-fromBin
又是:
01010101
10101010
00001111
我正在 python 使用霍夫曼编码和解码算法创建一个压缩项目。我必须创建一个更小的文件。我正在使用从霍夫曼树中获取的字节值,并将它们作为字符串文字写入文件,如“0100101”我想转换这些相同的数字,以便它存储为二进制数。
假设 'binary number' 你指的是整数:
>>> int('0100101', 2)
37
使用内置的 int
函数以 2
为基数将字符串简单地转换为整数。
请参阅下面的代码,了解如何将表示存储在一个文件中的二进制值的字符串列表作为字节写入另一个文件。请注意,两种变体(已使用的和已取消注释的变体)都会为您提供相同的结果。
# lstStrBin = ['01001010','10100101','01001011']
lstStrBin = open("binaryToByteString_Cg.txt").readlines()
# byteArr = bytearray([int(strBin, 2) for strBin in lstStrBin])
bytesString = bytes([int(strBin, 2) for strBin in lstStrBin])
# print(byteArr) gives: bytearray(b'J\xa5K')
with open('binaryToByteString_Cg.bin', "wb") as f:
# f.write(byteArr)
f.write(bytesString)
binaryToBytes.bin
的内容(3个字节长,在SciTE中显示)是:
P.S。这里 binariesFile.txt 的内容:
01001010
10100101
01001011
ADDENDUM (2017-04-25)
:
根据 OP 的请求(见评论),我在下面提供了两种转换方式的两部分代码。代码读取一个 .txt
文件,其中包含 01010101
行,写入一个二进制文件 .bin-fromTxt
,.txt
文件中的每一行都有一个字节,然后读取 .bin-fromTxt
文件,并写入包含 01010101
行的 .txt-fromBin
文件。
在该过程结束时,.txt-fromBin
文件将具有与 .txt
文件相同的内容,表明来回转换成功。
with open('binaryToByteString_Cg.txt') as f_txt:
bytesString = bytes([int(strBin, 2) for strBin in f_txt.readlines()])
with open('binaryToByteString_Cg.bin-fromTxt', "wb") as f_bin:
f_bin.write(bytesString)
with open('binaryToByteString_Cg.bin-fromTxt', "rb") as f_bin:
bytesString = f_bin.read()
with open('binaryToByteString_Cg.txt-fromBin', "w") as f_txt:
for byte in bytesString:
f_txt.write( "{0:{fill}8b}\n".format(byte, fill='0'))
如果 binaryToByteString_Cg.txt
文件包含:
01010101
10101010
00001111
binaryToByteString_Cg.bin-fromTxt
文件包含:
最后的 binaryToByteString_Cg.txt-fromBin
又是:
01010101
10101010
00001111