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

时间:2015-01-20 22:46:27

标签: c++ bit-manipulation

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

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

3 个答案:

答案 0 :(得分:2)

执行此操作的一种方法是使用union

union ConversionUnion {
    long long numericValue;
    char byteValues[sizeof(long long)];
};

ConversionUnion converter;
converter.numericValue = /* ... your value ... */
std::string bytes(converter.byteValues, converter.byteValues + sizeof(long long));

这将值作为long long插入到union中,并将其作为适当大小的char数组读回,使用std::string构造函数将这些字节转换为{{ 1}}。

希望这有帮助!

答案 1 :(得分:1)

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

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

编辑:

甚至:

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

这可能比调用memcpy更快。

我同意这不是很好的c ++,或者c就此而言。

答案 2 :(得分:1)

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

  

Internet协议将big-endian定义为标准网络字节   用于包头中的所有数值的订单以及许多   设计用于更高级别的协议和文件格式   IP。 Berkeley套接字API定义了一组要转换的函数   来自网络字节顺序的16位和32位整数:htons   (host-to-network-short)和htonl(host-to-network-long)功能   将16位和32位值分别从机器(主机)转换为   网络秩序; ntohs和ntohl函数从网络转换为   主机订单。这些函数可能是大端系统上的无操作。

network byte order,即big-endian。没有标准库调用将long long转换为网络字节顺序。以下是一些模板,可用于在网络字节顺序中对std::string的任何整数类型进行序列化和反序列化。现场演示here

序列化

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 ) );