Tag: 字节顺序

反转C结构的字节顺序

我在C中有一个看起来像这样的结构: typedef u_int8_t NN; typedef u_int8_t X; typedef int16_t S; typedef u_int16_t U; typedef char C; typedef struct{ X test; NN test2[2]; C test3[4]; U test4; } Test; 我已经将字段的结构和写入值声明如下: Test t; int t_buflen = sizeof(t); memset( &t, 0, t_buflen); t.test = 0xde; t.test2[0]=0xad; t.test2[1]=0x00; t.test3[0]=0xbe; t.test3[1]=0xef; t.test3[2]=0x00; t.test3[3]=0xde; t.test4=0xdeca; 我通过UDP将此结构发送到服务器。 目前我在本地测试时工作正常,但是我现在需要将这个结构从我的little-endian机器发送到big-endian机器。 我真的不确定怎么做。 我已经研究过使用htons但是我不确定这是否适用于这种情况,因为它似乎只是为16或32位的unsigned ints定义,如果我理解正确的话。

字节序操作 – 有一个C库吗?

有了我编写的程序(使用原始文件数据),我经常需要在大端和小端之间进行转换的函数。 通常我自己写这些(这里有许多其他post都介绍过)但是我并不热衷于这样做有很多原因 – 主要原因是缺乏测试。 我真的不想花大量时间在大端模拟器中测试我的代码,而且通常只是省略大端机器的代码。 我还希望利用各种编译器提供的更快的function,同时仍然保持我的程序跨平台。 我能找到的唯一的东西是套接字调用,比如htons(),但是它们在每个平台上需要不同的#include文件,以及一些像这样的 GPL代码,但是这个特定的文件虽然全面,但似乎错过了一些高性能函数由一些编译器提供。 那么,有没有人知道一个经过充分测试的库(理想情况下只是一个.h文件)并提供了一套标准的函数来处理许多编译器和平台的字节序?

如何重新排序整数的字节?

我的任务是使用C将数据文件从big endian转换为little endian,反之亦然。我已经在线查看了大约3个小时的其他示例和阅读我的教科书,但是我很困惑甚至如何开始这个function。 到目前为止,我的事件顺序是正确的(1到4),但在我的convert_and_save函数中,我必须使用→ char buffer[4];创建一个char数组char buffer[4]; ? 有人可以帮帮我吗? 即使你只是给我一些关于查找内容的线索,我也会非常感激。 我需要编写一个名为的函数: void convert_and_save(struct record item, FILE * output_handle, int number); 在这个函数里面我做了以下一系列步骤: 使用以下方法将整数转换为字符数组: int integer_to_characters(int number, char * buffer) { memcpy(buffer, &number, 4); } 反转该数组中字符的顺序。 使用以下方法将字符数组转换回整数: int characters_to_integer(char * buffer) { int result; memcpy(&result, buffer, 4); return result; } 使用以下方法在输出文件上写入转换后的记录 void save_record(FILE * file_handle, struct record […]

IEEE754浮点值的便携式序列化

我最近一直致力于一个需要存储和加载大量数据的系统,包括单精度浮点值。 我决定标准化整数的网络字节顺序,并决定以big-endian格式存储浮点值,即: |– Byte 0 –| |– Byte 1 -| Byte 2 Byte 3 # ####### # ####### ######## ######## Sign Exponent Mantissa 1b 8b, MSB first 23b, MSB first 理想情况下,我想提供像htonl()和ntohl()这样的函数,因为我已经使用它们来擦除整数,我也希望以尽可能多的平台独立性的方式实现它(同时假设float类型对应于IEEE754 32位浮点值)。 有没有办法,可能使用ieee754.h ,这样做? 我有一个似乎有效的答案,我将在下面发布,但它似乎非常缓慢和低效,我将不胜感激任何有关如何使其更快和/或更可靠的建议。

如何使用C以编程方式找到PC的Endian-ness?

可能重复: 在C ++程序中以编程方式检测字节顺序 是否有任何库函数可用于查找我的PC的字节序?

字节序可以指一个字节的位顺序吗?

我正在阅读Chris Adamson撰写的“学习核心音频:适用于Mac和iOS的音频编程实践指南”,并且作者一度将big-endian描述为: 字节或字的高位在数值上比低位更重要。 但是,直到现在我虽然大小端的问题只适用于字节顺序而不是位顺序。 无论我们是在谈论小端还是大端系统,一个字节都具有相同的位顺序(从左到右)。 我错了吗? 作者错了吗? 还是我误解了他的观点?

Little vs Big Endianess:如何解释测试

所以我正在编写一个程序来测试机器的endianess并打印它。 我理解小端和大端的区别,但是,从我在网上找到的,我不明白为什么这些测试显示了机器的结束。 这就是我在网上找到的。 *(char *)&x是什么意思,它与一个机器是Little-Endian的相同之处是什么? int x = 1; if (*(char *)&x == 1) { printf(“Little-Endian\n”); } else { printf(“Big-Endian\n”); }

htonl()和ntohl()在整数上的输出相同

我在little-endian [LE]机器[Linux,Intel处理器]上运行了以下程序。 我无法在下面的代码片段中解释3个输出。 由于机器是LE,a的值存储为0x78563412 。 打印时,它显示其实际值。 由于它是LE机器,我希望ntohl()成为无操作并显示0x78563412 ,它正在做。 但是,对于包含htonl()第二个print语句,我期望0x12345678 。 有人可以帮我理解他们为什么一样吗? int main() { int a = 0x12345678; printf(“Original – 0x%x\n”, (a)); printf(“Network – 0x%x\n”, htonl(a)); printf(“Host – 0x%x\n”, ntohl(a)); return 0; } 输出: Original – 0x12345678 Network – 0x78563412 Host – 0x78563412

将Little Endian转换为Big Endian

我只是想问一下我的方法是否正确,从小端到大端转换,只是为了确保我理解差异。 我有一个存储在little-endian中的数字,这里是数字的二进制和hex表示: ‭0001 0010 0011 0100 0101 0110 0111 1000‬ ‭12345678‬ 在big-endian格式中,我相信应该交换字节,如下所示: 1000 0111 0110 0101 0100 0011 0010 0001 ‭87654321 它是否正确? 此外,下面的代码尝试执行此操作但失败。 有什么明显的错误或者我可以优化一些东西吗? 如果代码对于此转换有害,请解释原因并展示执行相同转换的更好方法吗? uint32_t num = 0x12345678; uint32_t b0,b1,b2,b3,b4,b5,b6,b7; uint32_t res = 0; b0 = (num & 0xf) << 28; b1 = (num & 0xf0) << 24; b2 = (num & 0xf00) << […]