如何将long long
转换为与二进制值匹配的char
数组?我正在开发一个程序,通过网络发送二进制字符串来控制照明系统。我现在设置的方式是我有一个接收std::string
的函数,然后将其发送给客户端。我真的想保持这种架构(std::string
很容易来回传递)?
编辑:
我正在寻找long long
类型的二进制序列化作为字节数组。
答案 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 ) );