字节到四字的矢量
Vector of bytes to quadword
我有一个字节向量,我想将它们转换为四字数据类型(64位小端序)。
矢量到Dword(32位)的示例:
int DataConversor::toDword()
{
return ((data[0] << 24) | (data[1] << 16) | (data[2] << 8) | (data[3]));
}
根据Visual Studio 2013:,问题正在以超过32字节的未定义行为转移
__int64 DataConversor::toQuadWord()
{
return (__int64)((data[0] << 64 | data[1] << 56 | data[2] << 48 | data[3] << 40 |
data[4] << 32 | data[5] << 24) | (data[6] << 16) | (data[7] << 8) | (data[8]));
}
有什么方法可以在不使用_ASM指令的情况下实现这一点?
嗯,data[0] << 64
可能是一个意外。。。
但是data[0] << 56
不是你想要的。您需要static_cast<uint64_t>(data[0]) << 56
。然后在所有其他操作中也重复了这种情况。
因此,您希望您的函数看起来像:
int64_t DataConversor::toQuadWord() {
uint64_t result = 0;
result |= static_cast<uint64_t>(data[0]) << 56;
result |= static_cast<uint64_t>(data[1]) << 48;
result |= static_cast<uint64_t>(data[2]) << 40;
result |= static_cast<uint64_t>(data[3]) << 32;
result |= static_cast<uint64_t>(data[4]) << 24;
result |= static_cast<uint64_t>(data[5]) << 16;
result |= static_cast<uint64_t>(data[6]) << 8;
result |= static_cast<uint64_t>(data[7]) << 0;
return (int64_t) result;
}
没有独立的编译器。您可以在GCC上使用int64_t __builtin_bswap64 (int64_t x)
,在MSVC上使用unsigned __int64 _byteswap_uint64(unsigned __int64 value)
来交换端序。如果您的数组在任何地方都定义为大端序,那么您可以使用它(至少它不会改变其他系统上的端序)。您必须将类型转换为64位整数。
int64_t convertEndianess(uint8_t x[])
{
return _byteswap_uint64(*static_cast<int64_t*>(x));
}
使用little-endian,并且您知道字节是打包的,您可以执行
return *reinterpret_cast<int64_t*>(&data[0]) ;
相关文章:
- 在java中读取c++字节的位字段
- 具有使用 UDP 套接字字节的限制的标头
- 如何使用连接器 c++ 在 mySQL 表二进制(16) 字段中存储 c++ 字节数组?
- UDP 套接字读取最后一个传入字节
- Qt TCP 套接字 - 写入超过 15 个字节
- 为什么 sys 套接字 recv 函数不填充数据但返回字节长度?
- 我想将四个字节合并为一个数字以进行串行传输
- 浅拷贝到协议缓冲区的字节字段中
- 两个 4 位位字段加起来不等于一个字节的大小 - 如何修复?
- C++,在阻塞模式下从套接字读取所有可用字节的最佳方法
- 为什么在未由语言本身定义的结构字节中的位字段顺序
- 从套接字到字节数组的读取数据中的意外字符
- 在64位机器上,我可以安全地并行操作64位四字的各个字节吗
- 在DEBUG模式下调整字节字段大小时发生访问冲突
- C 套接字仅发送第4个字节的数据
- C++套接字不能接收超过 21845 字节
- 根据C++代码在 PHP 中创建字节数据并将其传递给套接字
- C++32位字字节交换
- 使用 C++ 将四个字节转换为整数
- 字节到四字的矢量