2024-04-26 11:00:54 发布
网友
Python的方法是使用struct.unpack读取二进制数据。 我已经习惯了C#中的二进制阅读器和二进制写入程序,所以我做了这样一个:
from struct import * class BinaryStream: def __init__(self, base_stream): self.base_stream = base_stream def readByte(self): return self.base_stream.read(1) def readBytes(self, length): return self.base_stream.read(length) def readChar(self): return self.unpack('b') def readUChar(self): return self.unpack('B') def readBool(self): return self.unpack('?') def readInt16(self): return self.unpack('h', 2) def readUInt16(self): return self.unpack('H', 2) def readInt32(self): return self.unpack('i', 4) def readUInt32(self): return self.unpack('I', 4) def readInt64(self): return self.unpack('q', 8) def readUInt64(self): return self.unpack('Q', 8) def readFloat(self): return self.unpack('f', 4) def readDouble(self): return self.unpack('d', 8) def readString(self): length = self.readUInt16() return self.unpack(str(length) + 's', length) def writeBytes(self, value): self.base_stream.write(value) def writeChar(self, value): self.pack('c', value) def writeUChar(self, value): self.pack('C', value) def writeBool(self, value): self.pack('?', value) def writeInt16(self, value): self.pack('h', value) def writeUInt16(self, value): self.pack('H', value) def writeInt32(self, value): self.pack('i', value) def writeUInt32(self, value): self.pack('I', value) def writeInt64(self, value): self.pack('q', value) def writeUInt64(self, value): self.pack('Q', value) def writeFloat(self, value): self.pack('f', value) def writeDouble(self, value): self.pack('d', value) def writeString(self, value): length = len(value) self.writeUInt16(length) self.pack(str(length) + 's', value) def pack(self, fmt, data): return self.writeBytes(pack(fmt, data)) def unpack(self, fmt, length = 1): return unpack(fmt, self.readBytes(length))[0]
一旦有了一个流,就把它放在BinaryStream构造函数中,得到了一个BinaryStream:)
示例:
from binary import BinaryStream f = open("Users", "rb") stream = BinaryStream(f) users_count = stream.readUInt64() for i in range(users_count): username = stream.readString() password = stream.readString()
我用的是Zippoxer的代码,它几乎适用于所有的东西,谢谢。
但是,我对readString()有一些问题。在C#doc中指定长度编码为7字节。因此,我使用readUChar而不是readUInt16:
def readString(self): length = self.readUChar() return self.unpack(str(length) + 's', length)
现在它开始工作了。也许是因为我的问题?但它可能会帮助某人。。。
我想struct.unpack_from是你要找的。
Python的方法是使用struct.unpack读取二进制数据。 我已经习惯了C#中的二进制阅读器和二进制写入程序,所以我做了这样一个:
一旦有了一个流,就把它放在BinaryStream构造函数中,得到了一个BinaryStream:)
示例:
我用的是Zippoxer的代码,它几乎适用于所有的东西,谢谢。
但是,我对readString()有一些问题。在C#doc中指定长度编码为7字节。因此,我使用readUChar而不是readUInt16:
现在它开始工作了。也许是因为我的问题?但它可能会帮助某人。。。
我想struct.unpack_from是你要找的。
相关问题 更多 >
编程相关推荐