当前位置: 首页 > 知识库问答 >
问题:

没有NTOH的Endianness交换

桂鑫鹏
2023-03-14

我正在编写一个ELF分析器,但我在正确转换endianness时遇到了一些问题。我有一些函数来确定分析器的endianness和目标文件的endianness。

基本上,有四种可能的情况:

  • 在big-endian对象文件上运行的big-endian编译分析器
    • 什么都不需要转换
    • 字节顺序需要交换,但ntohs/l()和htons/l()都是big-endian机器上的空宏,因此它们不会交换字节顺序。这就是问题所在
    • 字节顺序需要交换,因此使用htons()交换字节顺序
    • 什么都不需要转换

    有没有一个函数我可以用来显式交换字节顺序/更改endianness,因为ntohs/l()和hton/l()考虑到主机的endianness,有时不转换?或者我需要找到/写入我自己的交换字节顺序函数?

共有3个答案

齐思淼
2023-03-14

我是否需要查找/编写自己的交换字节顺序函数?

是的,你知道。但是,为了简单起见,我让你们看看这个问题:在C语言中,如何在大端值和小端值之间进行转换?它给出了特定于编译器的字节顺序交换函数列表,以及字节顺序交换函数的一些实现。

公良鸿禧
2023-03-14

在Linux中,endian中有几个转换函数。h,允许在任意endpoint之间转换:

uint16_t htobe16(uint16_t host_16bits);
uint16_t htole16(uint16_t host_16bits);
uint16_t be16toh(uint16_t big_endian_16bits);
uint16_t le16toh(uint16_t little_endian_16bits);

uint32_t htobe32(uint32_t host_32bits);
uint32_t htole32(uint32_t host_32bits);
uint32_t be32toh(uint32_t big_endian_32bits);
uint32_t le32toh(uint32_t little_endian_32bits);

uint64_t htobe64(uint64_t host_64bits);
uint64_t htole64(uint64_t host_64bits);
uint64_t be64toh(uint64_t big_endian_64bits);
uint64_t le64toh(uint64_t little_endian_64bits);

编辑,不太可靠的解决方案。可以使用联合以任何顺序访问字节。这很方便:

union {
    short number;
    char bytes[sizeof(number)];
};
赵高雅
2023-03-14

我认为值得在这里提出罗布·派克(围棋的作者之一)的《字节顺序谬误》一文。

如果你做得对(即你对你的平台字节顺序没有任何假设),那么它就会起作用。你需要关心的是ELF格式的文件是在Little Endian模式下还是在Big Endian模式下。

从文章中:

假设您的数据流有一个小的endian编码的32位整数。下面是如何提取它(假设无符号字节):

i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);

如果是big endian,下面是如何提取它:

i = (data[3]<<0) | (data[2]<<8) | (data[1]<<16) | (data[0]<<24);

让编译器担心如何优化它。

 类似资料:
  • 我正在开发一个程序,在这个程序中,我将一些数据存储在一个整数中,并按位进行处理。例如,我可能会收到数字48,我会一点一点地处理它。一般来说,整数的endian取决于整数的机器表示,但是Python是否能保证整数始终是小endian?或者我需要像在C中一样检查endianness,然后为这两种情况编写单独的代码吗? 我问这个问题是因为我的代码运行在一台Sun机器上,虽然它现在运行的机器使用的是英特尔

  • 问题内容: 我正在尝试使用Spring @Transactional批注,但是在调用 findAll 方法时出现问题,并且出现以下错误: 人DAO: 这是我的: 我尝试删除此行,但是又出现了一个错误,为什么这行不通? 问题答案: 您必须显式声明对事务管理器注释的支持 添加到您的配置中: tx是xmlns:tx =“ http://www.springframework.org/schema/tx”

  • 问题内容: 我是hibernate的新手。 自动创建的hibernate.cfg.xml(Netbeans向导) 自动创建的HibernateUtil.java 自动创建带有注释的POJO类 尝试从数据库获取对象但出现错误: 得到一个对象: hibernate.cfg.xml 问题答案: 加 //此语句将启动交易 就在你的 然后在交易结束时通过调用提交更改。

  • 我写一个简单的Rabbitmq生产者与Spring启动2.2.7。 在代理端,我设置了一个直接交换示例,一个名为samples的队列。默认值,并将它们绑定在一起添加示例。默认绑定键。 运行应用程序时,我得到以下错误 rabbitmq服务器配置是正确的,因为我有一个python生产者已经成功地将消息放入“samples.default”队列。 在SpringBoot中,我使用了jackson序列化,

  • 我正在读Chris Adamson的《学习核心音频:Mac和iOS音频编程实践指南》,作者曾将big endian描述为: 字节或字的高位在数字上比低位更重要。 然而,到目前为止,我认为大小端的问题只适用于字节顺序,而不适用于位顺序。无论我们讨论的是小端系统还是大端系统,一个字节都有相同的位顺序(从左到右)。我错了吗?作者错了吗?还是我误解了他的意思?

  • 有人能帮我解决这个错误并解释我怎么了吗? 我正在开发一个简单的驼峰路径来处理信息,然后将其存储在文件中。 我正在使用的技术: JDK 11 Apache Camel 3.3.0 Spring靴2.3.0 当我想测试骆驼路线时,我得到了以下错误。 这是我的路线 这是我的测试用例 这是我的gradle档案