如何在C ++中将little-endian 64转换为主机字节顺序

时间:2014-01-23 08:25:56

标签: c++ endianness

我需要将little-endian 64转换为主机字节顺序。在winapi我找不到这样的功能,所以我需要自己编写,任何人都可以帮助我吗?谢谢!

4 个答案:

答案 0 :(得分:3)

使用htonll。它将无符号__int64转换为网络字节顺序。

答案 1 :(得分:2)

我认为您需要首先获得主机的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 ;  

}

答案 2 :(得分:2)

在Linux中,您可以使用uint64_t htobe64(uint64_t host_64bits);

查看man page了解详情。

答案 3 :(得分:1)

如果您正在阅读外部数据,通常的解决方案是构建 按指定的方式增加各个值:

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++)的{​​{1}}(其中source.get() 指向缓冲区中的位置)。在这种情况下,你也 必须确保初始p之间有8个字节 执行转换之前缓冲区的结尾。