如何在Python中正确填充数字';s结构
我有一个这样的元组(注意第一个元素可以是任意大小的(大但不是非常大,即2**12-1可以),第二个元素总是在[0255]范围内)如何在Python中正确填充数字';s结构,python,struct,byte,Python,Struct,Byte,我有一个这样的元组(注意第一个元素可以是任意大小的(大但不是非常大,即2**12-1可以),第二个元素总是在[0255]范围内) t=[(0137),(0180),(0178),(0171),(013),…] 我想将这些数字作为字节存储在文件系统中(用于压缩)。这意味着我以后还要使用这些位来恢复元组。还请注意,必须使用Big-endian 对于压缩后的idx,v: 如果v: f、 写入(结构包(“>I”,idx)) f、 写入(结构包(“>I”,v)) 但是,当我尝试获取数字时,如下所示:
t=[(0137),(0180),(0178),(0171),(013),…]
我想将这些数字作为字节存储在文件系统中(用于压缩)。这意味着我以后还要使用这些位来恢复元组。还请注意,必须使用Big-endian
对于压缩后的idx,v:
如果v:
f、 写入(结构包(“>I”,idx))
f、 写入(结构包(“>I”,v))
但是,当我尝试获取数字时,如下所示:
打开(文件路径,'rb')作为文件:
data=file.read(4)
nums=[]
而数据:
num=struct.unpack(“>I”,数据)[0]
打印(个)
data=file.read(4)
nums.append(num)
我没有得到上面的数字(我是为一些数字,但后来它变得一团糟,可能是因为位填充)
如何与比特填充保持一致?如何使用struct.pack('>I,…)
添加我以后可以可靠获得的东西
更新:
对于以下元组
[(0,137)、(0,80)、(0,78)、(0,71)、(0,13)、(0,10)、(0,26)、(6,0)、(0,0)、(9,13)、(0,73)、(0,72)、(0,68)、(0,82)、(9,0)、(0,1)、(0,44)、(15,1)、(17,8)、(0,2)、(15,0)、(0,246)]
我使用我的方法得到以下数字:
[0,137,0,80,0,78,0,71,0,13,0,10,0,26,9,13,0,73,0,72,0,68,0,82,0,1,0,44,15,1,17,8,0,2,0,246…]
看,在(6,0)点开始发散。在那之前一切都很好。但它会自我纠正吗??在9点,13点,并且继续表现良好。您的代码似乎工作正常。但是,您确实有以下行:
if v:
对于第二个元素为0
的某些元组,v
将为False
,这些元组不会写入文件,因此在从该文件读取时,您也不会看到它们
另外,由于您是成对编写元素,因此可以使用
>II
作为格式:
从结构导入包、解包、计算
原文=[(0,137)、(0,80)、(0,78)、(0,71)、(0,13)、(0,10)、(0,26)、(6,0)、(0,0)、(9,13)、(0,73)、(0,72)、(0,68)、(0,82)、(9,0)、(0,1)、(0,44)、(15,1)、(17,8)、(0,2)、(15,0)、(0,246)]
filename=“test.txt”
fileformat=“>II”
打开(文件名为“wb”)作为fp:
对于原件中的元素:
fp.write(包(文件格式,*元素))
打开(文件名为“rb”)作为fp:
elements=iter(lambda:fp.read(calcsize(fileformat)),b“”)
readback=[为元素中的元素解包(文件格式,元素)]
打印(回读==原件)
您的代码似乎工作正常。但是,您确实有以下行:
if v:
对于第二个元素为0
的某些元组,其中的一些元组的v
将是False,因此,从该文件读取时,您将不会看到它们
另外,由于您是成对编写元素,因此可以使用>II
作为格式:
从结构导入包、解包、计算
原文=[(0,137)、(0,80)、(0,78)、(0,71)、(0,13)、(0,10)、(0,26)、(6,0)、(0,0)、(9,13)、(0,73)、(0,72)、(0,68)、(0,82)、(9,0)、(0,1)、(0,44)、(15,1)、(17,8)、(0,2)、(15,0)、(0,246)]
filename=“test.txt”
fileformat=“>II”
打开(文件名为“wb”)作为fp:
对于原件中的元素:
fp.write(包(文件格式,*元素))
打开(文件名为“rb”)作为fp:
elements=iter(lambda:fp.read(calcsize(fileformat)),b“”)
readback=[为元素中的元素解包(文件格式,元素)]
打印(回读==原件)
给定以下输入:
compressed = [(0, 137), (0, 80), (0, 78), (0, 71), (0, 13), (0, 10), (0, 26), (6, 0), (0, 0), (9, 13), (0, 73), (0, 72), (0, 68), (0, 82), (9, 0), (0, 1), (0, 44), (15, 1), (17, 8), (0, 2), (15, 0), (0, 246)]
请尝试使用以下代码编写数据:
import struct
with open('file.dat', 'wb') as f:
for idx, v in compressed:
f.write(struct.pack(">I", idx))
f.write(struct.pack(">I", v))
以下代码用于阅读:
with open('file.dat', 'rb') as f:
data = f.read(4)
nums = []
while data:
idx = struct.unpack(">I", data)[0]
data = f.read(4)
v = struct.unpack(">I", data)[0]
data = f.read(4)
nums.append((idx,v))
和nums
包含:
[(0, 137), (0, 80), (0, 78), (0, 71), (0, 13), (0, 10), (0, 26), (6, 0), (0, 0), (9, 13), (0, 73), (0, 72), (0, 68), (0, 82), (9, 0), (0, 1), (0, 44), (15, 1), (17, 8), (0, 2), (15, 0), (0, 246)]
这与输入相同,事实上nums==compressed
给出了True
以下输入:
compressed = [(0, 137), (0, 80), (0, 78), (0, 71), (0, 13), (0, 10), (0, 26), (6, 0), (0, 0), (9, 13), (0, 73), (0, 72), (0, 68), (0, 82), (9, 0), (0, 1), (0, 44), (15, 1), (17, 8), (0, 2), (15, 0), (0, 246)]
请尝试使用以下代码编写数据:
import struct
with open('file.dat', 'wb') as f:
for idx, v in compressed:
f.write(struct.pack(">I", idx))
f.write(struct.pack(">I", v))
以下代码用于阅读:
with open('file.dat', 'rb') as f:
data = f.read(4)
nums = []
while data:
idx = struct.unpack(">I", data)[0]
data = f.read(4)
v = struct.unpack(">I", data)[0]
data = f.read(4)
nums.append((idx,v))
和nums
包含:
[(0, 137), (0, 80), (0, 78), (0, 71), (0, 13), (0, 10), (0, 26), (6, 0), (0, 0), (9, 13), (0, 73), (0, 72), (0, 68), (0, 82), (9, 0), (0, 1), (0, 44), (15, 1), (17, 8), (0, 2), (15, 0), (0, 246)]
这与输入相同,事实上,nums==compressed
给出了True
确切地说,我不知道。这就是我为什么尝试Big endian的原因。指示是否应该继续。@finefoot如果你愿意,你可以看看我更新的问题。我的号码总是在这个范围内。确切地说,我不知道。这就是我为什么尝试Big endian的原因。指示是否继续。@finefoot如果您愿意,您可以查看我更新的问题。我的号码将始终在该范围内。哈哈。抢手货我相信这很难发现。@DragosStrugar更新了一点,也许你会发现它很有用。抢手货“我相信这很难发现。”DragosStrugar更新了一点,也许你会发现它很有用。但是要照顾好它,你是什么意思@Dragosstrugar在问题中:参见,在(6,0)处,它开始发散。在那之前一切都很好。但它会自我纠正吗??9点13分,成绩仍然不错。
问题由@finefootOk解决,我还没有看到您添加的问题的第二部分。我以为你在要求别的东西。现在纠正我。谢谢对但是要照顾好它,你是什么意思@Dragosstrugar在问题中:参见,在(6,0)处,它开始发散。在那之前一切都很好。但它会自我纠正吗??9点13分,成绩仍然不错。
问题由@finefootOk解决,我还没有看到您添加的问题的第二部分。我以为你在要求别的东西。现在纠正我。谢谢