如何将Little-endian 64转换为C 中的主字节订单

How to convert little-endian 64 to host byte order in C++

本文关键字:字节 Little-endian 转换      更新时间:2023-10-16

我需要将小范围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个字节以及在进行转换之前的缓冲区的末端。