如何将长长字符串转换为二进制字符串

How to convert a long long to a binary character string?

本文关键字:字符串 二进制 转换      更新时间:2023-10-16

如何将long long转换为与二进制值匹配的char数组?我正在开发一个程序,其中通过网络发送二进制字符串来控制照明系统。我现在设置它的方式是我有一个接收std::string的函数,然后将其发送给客户端。我真的想保留这种架构(std::string很容易来回传递)?

编辑:我正在寻找long long类型的二进制序列化作为字节数组。

如果您不介意使用原始字符数组,您可以简单地选择:

char c[sizeof (long long)];
memcpy(c, &longlongValue, sizeof (long long));

编辑:

甚至:

char c[sizeof (long long)];
*(long long*)c = longlongValue;

这可能比调用Memcpy更快。

我同意这不是漂亮的 c++ 或 c。

您可能会考虑的一件事是网络上的客户端和服务器可能具有不同的字节序。

互联网协议将大端定义为标准网络字节 用于数据包标头中所有数值的顺序和许多 设计用于 高原油Berkeley 套接字 API 定义了一组要转换的函数 进出网络的 16 位和 32 位整数字节顺序:HTS (主机到网络短路)和 htonl(主机到网络长)功能 将 16 位和 32 位值分别从计算机(主机)转换为 网络秩序;NTOHS 和 NTOHL 函数从网络转换为 主机顺序。这些函数在大端系统上可能是无操作的。

网络字节顺序,即大端序。 没有标准的库调用来将long long与网络字节顺序相互转换。 下面是一些模板,可用于按网络字节顺序序列化和反序列化任何整型类型std::string。 现场演示在这里。

序列化

template< typename T >
string serialize( T val ) {
    string str( sizeof(T), 0 );
    for(size_t i=0; i<sizeof(T); ++i, val >>= 8)
        str[sizeof(T)-i-1] = char(val);
    return str;
}

反序列化

template< typename T >
T deserialize( const string & data ) {
    T val = 0;
    for(unsigned char u : data) val = (val << 8) | u;
    return val;
}

并像这样使用它

long long val = 201501210654;
std::string str = serialize(val);
assert( val == deserialize<long long>( str ) );