如何“声明”一个空字节变量?

Posted

技术标签:

【中文标题】如何“声明”一个空字节变量?【英文标题】:How do I 'declare' an empty bytes variable? 【发布时间】:2013-05-16 17:07:39 【问题描述】:

如何在 Python 3 中初始化(“声明”)一个空的 bytes 变量?

我正在尝试接收字节块,然后将其更改为 utf-8 字符串。 但是,我不确定如何初始化初始变量 保存整个字节序列。此变量称为msg。 我无法将其初始化为None,因为您无法添加bytesNoneType。我无法将其初始化为 unicode 字符串,因为那时 我将尝试将bytes 添加到字符串中。 此外,随着接收程序的发展,它可能会让我陷入混乱 包含仅包含部分字符的一系列字节。 我不能没有msg 初始化,因为那时msg 将是 赋值前引用。 以下是有问题的代码

def handleClient(conn, addr):
    print('Connection from:', addr)
    msg = ?
    while 1:
        chunk = conn.recv(1024)
        if not chunk:
            break
        msg = msg + chunk
    msg = str(msg, 'UTF-8')
    conn.close()
    print('Received:', unpack(msg))

【问题讨论】:

这是初始化,不是声明。 Python 没有类型声明。 你会说“初始化”还是“实例化”?也许两者兼而有之……但正如您所说,绝对不是“声明” 【参考方案1】:

只需使用一个空字节字符串,b''

但是,重复连接到一个字符串需要多次复制该字符串。可变的bytearray 可能会更快:

msg = bytearray()  # New empty byte array
# Append data to the array
msg.extend(b"blah")
msg.extend(b"foo") 

要将字节数组解码为字符串,请使用msg.decode(encoding='utf-8')

【讨论】:

你也可以只将接收到的块保存在一个列表中,并在最后加入它们。 即使程序不是完全受 I/O 限制在套接字上等待,我也无法想象性能成本实际上会在任何地方产生影响。 通过快速测试,在 64 位 Python 3.3.1 中,有 1024 个 1024 字节的块,bytes 用了 30.1ns,bytearray 用了 29.6ns,join 用了 29.9ns。 【参考方案2】:

根据文档:

块引用 socket.recv(bufsize[, flags]) 从套接字接收数据。返回值是一个字符串,表示接收到的数据。 块引用 所以,我认为 msg="" 应该可以正常工作:

>>> msg = ""
>>> msg
''
>>> len(msg)
0
>>>

【讨论】:

您似乎在引用 the Python 2.x documentation,但问题是关于 Python 3,where recv returns bytes Python 2 和 3 之间的行为确实不同。我只是将我的代码从 Python 2 移植到 3,以摆脱与 unicode 相关的额外代码。然后我遇到了这种差异,这就是我最终提出这个问题的方式。 哎呀...抱歉没有在上面看到 python 3 :(【参考方案3】:

使用msg = bytes('', encoding = 'your encoding here')

如果你想使用默认编码,只需使用msg = b'',但是如果它不是相同的编码,这将导致整个缓冲区的垃圾

【讨论】:

【参考方案4】:

bytes() 为我工作;

>>> bytes() == b''
True

【讨论】:

以上是关于如何“声明”一个空字节变量?的主要内容,如果未能解决你的问题,请参考以下文章

字节码和变量声明

java如何生成字节码文件?

如何将数字转换为字节?

KotlinKotlin 变量与常量 ( 变量声明 | 只读变量 | 类型推断 | 编译时常量 | Kotlin 字节码查看面板 | Kotlin 引用数据类型 )

java字符串按字节补空问题

1分钟了解C语言正确使用字节对齐及#pragma pack的方法