如何将Little-endian 64转换为C 中的主字节订单
How to convert little-endian 64 to host byte order in C++
我需要将小范围64转换为主机字节订单。在Winapi中,我找不到这样的功能,所以我需要写自己的功能,有人可以帮我吗?谢谢!
使用htonll。它将无符号的__int64
转换为网络字节顺序。
我认为您需要先获得主机的endiannes,如果需要转换任何东西,您可以在此之后决定:
#define BIG_ENDIAN 1
#define LITTLE_ENDIAN 0
int getEndiannes()
{
int n = 1;
char *p = &n;
if(*p)
return LITTLE_ENDIAN;
else
return BIG_ENDIAN ;
}
在Linux中您可以使用uint64_t htobe64(uint64_t host_64bits);
检查man
页面以获取更多详细信息。
如果您正在阅读外部数据,则通常的解决方案是构建提高指定的单个值:
unsigned long long // The only type guaranteed long enough for 64 bits
readData( std::istream& source )
{
unsigned long long results = source.get();
results |= source.get() << 8;
results |= source.get() << 16;
results |= source.get() << 24;
results |= source.get() << 32;
results |= source.get() << 40;
results |= source.get() << 48;
results |= source.get() << 56;
return results;
}
当然,您确实需要某种错误检查,以防万一该文件在8个字节的中间结束。(但它是足以检查一次,毕竟所有字节已经阅读。)
如果数据已经在缓冲区中,则只需替换 static_cast<unsigned char>(*p++)
用于source.get()
(其中p
指向缓冲区中的位置)。在这种情况下,您也必须确保初始p
之间有8个字节以及在进行转换之前的缓冲区的末端。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 在UNIX系统中使用DIR查找文件的字节大小
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- std::当在256字节边界上写入整数时,流的奇怪行为
- 当比特(而不是字节)的顺序至关重要时的持久性
- 从值小于256的uint16到uint8的Endian安全转换
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 如何在文件中查找字节序列
- luaL_dofile在已知良好的字节码上失败,可以使用未编译的版本
- 字节到位运算符重载C++
- 如何从Little Endian UTF-16编码字节中获取C++std::string
- 如何在C 中的Little Endian中读取来自二进制文件的单独的十六进制字符
- 如何将Little-endian 64转换为C 中的主字节订单
- 将Integer转换为Little Endian十六进制字符串
- 如何以可移植的方式将integer转换为little-endian
- C++将double序列化为little-endian中的二进制文件
- 如何在C++中从字节数组(在 BIG-ENDIAN 中)中提取单个字段
- big和little endian浮点之间的区别是什么
- Big Endian字节与字符串作为字符串数据库中的键