gpt4 book ai didi

c - 支持 Linux 用户空间中的字节排序

转载 作者:IT王子 更新时间:2023-10-29 00:45:09 28 4
gpt4 key购买 nike

我正在用 C 在 Linux 上编写一个程序来分析从嵌入式系统生成的核心文件。核心文件可能是小端 (ARM) 或大端 (MIPS),分析它们的程序可能在小端主机 (x86) 或大端 (PowerPC) 上运行。

通过查看 header ,我知道核心是 LE 还是 BE。我宁愿我的程序不需要需要知道它运行的主机是小端还是大端,我想使用一个 API 来为我处理它。如果没有更好的选择,我想我会开始依赖#ifdef __BIG_ENDIAN__。

在 Linux 内核中,我们有 cpu_to_le32 等将 native 字节顺序转换为小端,等等。在用户空间中有 htonl 等,它们从 native 转换为大端,但没有等效的从 native 到小端的转换,我可以找到。

谁能为用户空间推荐一个合适的 API?

编辑:为了清楚起见,我正在寻找一个已经知道我的 CPU 是大端还是小端并相应地交换字节的 API。为此,我不想在我的代码中乱扔#ifdefs。我不只是在寻找代码片段来交换字节;谢谢你,但这不是重点。

最佳答案

#include <arpa/inet.h>漂亮且便携,但只能保证{ntoh,hton}{s,l} .如果您需要对 64 位值进行转换,或者需要对大端进行字节序翻转(其中 ntohhton 什么都不做),这还不够。

在 Linux (glibc) 上, #include <endian.h> 提供以下内容,定义为适合当前机器。

htobe16  be16toh    htole16  le16toh
htobe32 be32toh htole32 le32toh
htobe64 be64toh htole64 le64toh

在 *BSD 上, #include <sys/endian.h> 提供了这些相同的宏。

关于c - 支持 Linux 用户空间中的字节排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/874617/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com