首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ReadInt()、ReadByte()、ReadString()等?

ReadInt()、ReadByte()、ReadString()等?
EN

Stack Overflow用户
提问于 2009-01-14 07:34:04
回答 4查看 15.4K关注 0票数 6

函数ReadInt()、ReadByte()和ReadString() (举几个例子)存在于其他语言中,用于从流中读取输入。我正在尝试从套接字中读取,我想使用这样的函数。他们是以不同的方式藏在Python的某个地方,还是有人为它做了一个库?

此外,还有Writedatatype()对应项。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-01-14 07:38:17

我认为从…是你要找的。

票数 8
EN

Stack Overflow用户

发布于 2010-12-02 18:37:08

Python的方法是使用struct.unpack读取二进制数据。我非常习惯于BinaryReader和BinaryWriter in C#,所以我做了以下这些:

代码语言:javascript
运行
复制
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 :)

示例:

代码语言:javascript
运行
复制
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()
票数 11
EN

Stack Overflow用户

发布于 2014-03-19 13:30:37

我使用了Zippoxer的代码,它适用于几乎所有的东西,谢谢。

但是,我对readString()有一些问题。在C#文档中指定长度编码为7个字节。因此,我使用了readUChar而不是readUInt16:

代码语言:javascript
运行
复制
def readString(self):
    length = self.readUChar()
    return self.unpack(str(length) + 's', length)

现在起作用了。也许是因为我的问题?但它可能对某人有帮助..。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/442188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档