【问题标题】:What is the equivalent of an Python ASCII encoded byte string in C/C++ when dealing with sockets?在处理套接字时,C/C++ 中的 Python ASCII 编码字节字符串的等价物是什么?
【发布时间】:2021-11-20 00:12:00
【问题描述】:

我在 C 和 C++ 套接字编程方面的背景一般。

暂时作为项目的一部分,我不得不检查 Python 3 中的套接字编程。
我正在查看以下示例: https://support.mecademic.com/support/solutions/articles/64000253388-python-example-simple-tcp-ip-socket-client

关于命令client.send(bytes(cmd+'\0','ascii'))
我知道如果使用网络套接字等低级数据连接,Python 3 将数据作为字节字符串传输:数据类型字节。

突然间,我在想这个命令将如何由 c/c++ 客户端实现,但我对缓冲区的编码/解码部分感到困惑。

我们以以下基于 poco 库的客户端为例

https://searchcode.com/codesearch/view/25852263/

在所有示例中,缓冲区都是字符数组。

我想问的是,如果有人想用一个 c++ 像上面一个,那么发送和接收部分保持不变?

e.x

int n = ss.sendBytes("hello", 5);
char buffer[256];
n = ss.receiveBytes(buffer, sizeof(buffer));

意味着默认情况下 C char 数组是 ascii 编码的?

或者应该在发送缓冲区之前将例如 ascii 字符串转换为字节数组,如下例所示:

https://www.includehelp.com/c/convert-ascii-string-to-byte-array-in-c.aspx

因此接收也需要任何解码?

【问题讨论】:

    标签: c++ sockets


    【解决方案1】:

    请告诉我我是否正确理解了您的问题。您正在尝试发送和接收字节。如果您的 API 采用 char[] 数组,则不应将单个字符转换为字节。

    例如,您将传递“C8ICS33”而不是“43 38 49 43 53 33 33”。

    有时在 c++ 中,API 将采用 std::uint8_t[]std::byte[] 数组而不是字符。 std::uint8_t 只是一个字节大小的无符号整数。 std::byte 有点复杂,但通常没有人使用它们。

    所以 TL;DR:不要将您的 char[] 转换为“字节”

    【讨论】:

      【解决方案2】:

      是的,在 C 和 C++ 中,char 数组通常默认保存 ASCII(或 UTF-8,就 C 风格的字符串而言,它可以被认为是向后兼容的 ASCII 超集),所以没有不需要对这些类型的字符串进行编码或解码。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-17
        • 1970-01-01
        • 2012-11-02
        • 2020-06-03
        • 1970-01-01
        • 2011-06-03
        • 2012-08-30
        • 1970-01-01
        相关资源
        最近更新 更多