函数ReadInt(),ReadByte()和ReadString()(仅举几例)存在于其他语言中,用于从流中读取输入.我试图从套接字读取,我想使用这些函数.它们是以某种不同的方式隐藏在Python的某个地方,还是有人为它创建了一个库?
此外,还有Write 数据类型()对应项.
Mos*_*vah 10
Python的方法是使用struct.unpack来读取二进制数据.我已经习惯了C#中的BinaryReader和BinaryWriter,所以我做了这个:
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]
Run Code Online (Sandbox Code Playgroud)
一旦你有了一个流,你把它放在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()
Run Code Online (Sandbox Code Playgroud)