如何在python中使用可变位顺序和长度打包

时间:2013-05-09 00:48:28

标签: python endianness

我需要在Python中创建一个IP数据包,但字段的长度是不同的。每当我有一个大于1字节的字段时,我需要将字节顺序更改为大端。所以我做的是分别打包每个变量并将所有内容保存在文件中。我正在保存一个文件,因为我需要在打包后进行校验和,然后用校验和再次打包(如果有人有更好的想法,那就非常受欢迎了。)

我遇到两个问题:

1)我生成的数据包大于原始数据包解析信息(我生成的IP数据包仅在一个TTL字段中产生变化,但它应保持相同的大小)

2)当我解析我的数据包(文件中的数据流)时,一些信息已经改变(我没有改变它)。

这是原始数据包信息:

Ver: 4
HL: 12
TOS: 0
LEN: 50
ID= 456
OFF: 16384
TTL: 5
PROT: 6
CHSUM: 30512
SRC: 16885952
DST: 167880896
rem_head: ['Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q']
data: ['A', 'A']

此结果来自解析数据包。然后我验证校验和并将TTL减1并重新组装数据包如下:

pk_cksum=0
    arch= open('packet.out', 'w')
    arch.write( struct.pack('B',frstb) )
    arch.write( struct.pack('>B', pk_tos) )
    arch.write( struct.pack('>H', pk_len) )
    arch.write( struct.pack('>H', pk_id) )
    arch.write( struct.pack('>H',pk_off) )
    arch.write( struct.pack('B', pk_ttl) )
    arch.write( struct.pack('B', pk_p) )
    arch.write( struct.pack('>H', pk_cksum) )
    arch.write( struct.pack('>I', pk_src) )
    arch.write( struct.pack('>I', pk_dst) )
    if (pk_hl>5):
        for i in range(len(pk_head)):
            arch.write(struct.pack('c', pk_head[i])[0])
    if (pk_len>(pk_hl*4)):
        for j in range(len(pk_data)):
            arch.write(struct.pack('c', pk_data[j])[0])
    arch.close()

要验证打包是否成功,我使用相同的代码解析最后一个数据包然后我得到这些信息:

Ver: 4
HL: 0
TOS: 0
LEN: 50
ID= 456
OFF: 16384
TTL: 4
PROT: 6
CHSUM: 0
SRC: 3232235777
DST: 2818640397
data: ['@', '\x00', '\x00', '2', '\x01', '\xc8', '@', '\x00', '\x04', '\x06', '\x00', '\x00', '\x01', '\x01', '\xa8', '\xc0', '\r', '\n', '\x01', '\xa8', '\xc0', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'A']

如你所见,一些变量有另一个值,我不知道为什么。

有人能告诉我我做错了吗?

由于

1 个答案:

答案 0 :(得分:0)

您可以通过在格式字符串前加"<"(小)或">"(大)

来控制字节顺序