用于在网络中存储字节列表的Python方法(big-endian)字节顺序到文件(little-endian)

用于在网络中存储字节列表的Python方法(big-endian)字节顺序到文件(little-endian),python,file-io,binary,endianness,byte,Python,File Io,Binary,Endianness,Byte,我目前的任务是剖析包含P2P消息的tcpdump数据,我在x86机器上获取并写入文件的片段数据时遇到了问题。我的怀疑是,我对写入文件的字节有一个简单的尾数问题 我有一个字节列表,其中包含一段使用python pcapy包BTW读取和处理的P2P视频 bytes=[14、254、23、35、34、67等] 我正在寻找一种将这些字节存储到文件中的方法,这些字节目前保存在Python应用程序的列表中 目前我写的文章如下: def writePiece(self, filename, pieceinde

我目前的任务是剖析包含P2P消息的tcpdump数据,我在x86机器上获取并写入文件的片段数据时遇到了问题。我的怀疑是,我对写入文件的字节有一个简单的尾数问题

我有一个字节列表,其中包含一段使用python pcapy包BTW读取和处理的P2P视频

bytes=[14、254、23、35、34、67等]

我正在寻找一种将这些字节存储到文件中的方法,这些字节目前保存在Python应用程序的列表中

目前我写的文章如下:

def writePiece(self, filename, pieceindex, bytes, ipsrc, ipdst, ts): 
    file = open(filename,"ab")
    # Iterate through bytes writing them to a file if don't have piece already 
    if not self.piecemap[ipdst].has_key(pieceindex):
        for byte in bytes: 
            file.write('%c' % byte)
        file.flush()
        self.procLog.info("Wrote (%d) bytes of piece (%d) to %s" % (len(bytes), pieceindex, filename))

    # Remember we have this piece now in case duplicates arrive 
    self.piecemap[ipdst][pieceindex] = True

    # TODO: Collect stats 
    file.close()
正如您从for循环中看到的,我将字节写入文件的顺序与从线路处理它们的顺序相同(即网络或big-endian顺序)

可以说,作为片段有效载荷的视频在VLC:-D中不能很好地播放

我认为我需要将它们转换为小的尾端字节顺序,但不确定在Python中实现这一点的最佳方法

更新

为我制定的解决方案(适当地编写处理endian问题的P2P文章)是:

def writepice(self、文件名、片段索引、字节、ipsrc、ipdst、ts):
文件=打开(文件名为“r+b”)
如果不是self.piecemap[ipdst]。则具有_键(pieceindex):

little=struct.pack(“这可能已经在前面的中得到了回答。

为了节省一些工作,您可能需要使用(Python 2.6及更高版本):

这将完成0-255值到字节的所有转换,而无需进行所有循环

如果没有更多的信息,我看不出你的问题出在哪里。如果数据真的是字节级的,那么endianness就不是问题了,正如其他人所说

(顺便说一下,使用
字节
文件
作为变量名并不好,因为它会隐藏相同名称的内置项)。

您还可以使用:

而不是

f.write(struct.pack('<'+'B'*len(bytes), *bytes))

字节没有尾数-仅由几个字节组成的类型(即16位、32位等)可以是大端字节,也可以是小端字节。因此,目前你的问题毫无意义……但这肯定总是正确的吗?在某个硬件上,一个字节的LSB不可能位于字节的左端,但在另一个硬件上,它不可能位于字节的右端?当然,理论上,一个人可以有一个小端字节和一个大端字节te?谢谢你的建议,注意到。对于这个项目,我仅限于使用Python 2.5.4。感谢Scott对bytearray的深入了解。谢谢你的参考。所描述的基于numpy的方法非常简洁和快速。
    little = struct.pack('<'+'B'*len(bytes), *bytes) 
b = [14, 254, 23, 35]
f = open("file", 'ab')
f.write(bytearray(b))
from array import array
f.write(array('B', bytes))
f.write(struct.pack('<'+'B'*len(bytes), *bytes))
f.write(struct.pack('B' * len(bytes), *bytes))
# the < is redundant; there is NO ENDIANNESS ISSUE
f.write(struct.pack('%dB' % len(bytes), *bytes))