如何在Python中正确填充数字';s结构

如何在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)) 但是,当我尝试获取数字时,如下所示:

我有一个这样的元组(注意第一个元素可以是任意大小的(大但不是非常大,即2**12-1可以),第二个元素总是在[0255]范围内)

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解决,我还没有看到您添加的问题的第二部分。我以为你在要求别的东西。现在纠正我。谢谢