我需要将little-endian 64转换为主机字节顺序。在winapi我找不到这样的功能,所以我需要自己编写,任何人都可以帮助我吗?谢谢!
答案 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个字节
执行转换之前缓冲区的结尾。