首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字节顺序操纵--有没有一个C库可以做到这一点?

字节顺序操纵--有没有一个C库可以做到这一点?
EN

Stack Overflow用户
提问于 2010-04-03 18:20:15
回答 4查看 3.4K关注 0票数 9

对于我编写的那种程序(处理原始文件数据),我经常需要一些函数来在高字节和低字节之间进行转换。通常我自己写这些(这里有许多其他帖子介绍),但我并不热衷于这样做,原因有很多-主要的一个是缺乏测试。我真的不想花很长时间在大端仿真器中测试我的代码,并且经常完全省略大端机器的代码。我也更愿意利用各种编译器提供的更快的函数,同时仍然保持我的程序跨平台。

我能找到的唯一的东西是套接字调用,比如htons(),但它们在每个平台上需要不同的#include文件,以及一些GPL代码like this,然而,这个特定的文件,虽然全面,但似乎错过了一些编译器提供的一些高性能函数。

那么,有没有人知道一个经过良好测试的库(理想情况下只是一个.h文件),它提供了一组标准函数来处理跨许多编译器和平台的字节序问题?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-04-03 18:24:50

在过去的十年中,已经有许多关于Boost类(至少对于C++ )的提案来实现这一点,但不幸的是,没有一个提案取得成果。

我不知道还有什么比htons()函数集更好的广义解决方案。

票数 2
EN

Stack Overflow用户

发布于 2010-04-04 03:05:32

最简单的方法就是不编写与endian相关的代码。您永远不应该关心正在运行的系统的字节序是什么;唯一重要的是您正在读取或写入的任何外部数据的强制字节序。您不应该询问高位和低位端值之间的转换,而应该询问从特定端值到主机端值的转换,并且您可以以(几乎)完全可移植的与端序无关的方式编写代码:

例如:假设您正在从文件流中读取一个32位的big-endian整数:

代码语言:javascript
复制
/*
 * Note that callers should check feof(fp) afterward to verify that
 * there was enough data to read.
 */
uint32_t GetBE32(FILE* fp)
{
    uint32_t result;
    result  = fgetc(fp) << 24;
    result |= fgetc(fp) << 16;
    result |= fgetc(fp) <<  8;
    result |= fgetc(fp);
    return result;
}

uint32_t GetLE32(FILE* fp)
{
    uint32_t result;
    result  = fgetc(fp);
    result |= fgetc(fp) <<  8;
    result |= fgetc(fp) << 16;
    result |= fgetc(fp) << 24;
    return result;
}

(我之所以说“(几乎)完全可移植”,是因为它确实假设每个字节有8位。但是,如果您所在的系统不是这样,那么在处理外部数据时,您可能会遇到更大的问题。)

票数 2
EN

Stack Overflow用户

发布于 2013-12-21 02:11:10

在linux上,有<endian.h>

http://man7.org/linux/man-pages/man3/htole32.3.html

我很有兴趣了解其他操作系统是否也支持它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2570923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档