Tag: endianness

如何使用htonl将little endian转换为big endian

我有以下元素的结构。 此外,结构是完美填充。 typedef struct { uint16_t a; uint16_t b; uint8_t c; uint8_t d; uint8_t e[6]; } ad; 这个结构是一个小端。 我的意思是当我在我的大端机器上打印这个结构时,我得到以下内容 如果c = 1,则d = 2,e [0] = 3,e [1] = 4。 我明白了 c = 4,d = 3,e [0] = 2且e [1] = 1。 a和b被交换。 此外,e [1]与c交换,e [0]与d交换。 我正在使用如下的htonl函数。 但是,它不起作用,任何人都可以建议我一个很好的答案。

在C中将char从big endian转换为little endian

我正在尝试将char变量从big endian转换为little endian。 这正是: char name[12]; 我知道如何在大端和小端之间转换一个int,但是char会搞砸我。 我知道我必须首先将它转换为整数forms,我有。 为了转换int,这是我使用的: (item.age >> 24) | ((item.age >> 8) & 0x0000ff00) | ((item.age << 8) & 0x00ff0000) | (item.age << 24); 为了转换char,如果可能的话,我想以同样的方式做到这一点,因为这是我理解的唯一方法。

此代码是否检查endianess?

我在小端看到,LSB处于起始地址,在Big endian中,MSB处于起始地址。 所以我写了这样的代码。 如果不是为什么? void checkEndianess() { int i = 1; char c = (char)i; if(c) cout<<"Little Endian"<<endl; else cout<<"Big Endian"<<endl; }

逐字节打印4字节整数时出现意外行为

我有这个示例代码,用于将32位整数转换为ip地址。 #include int main() { unsigned int c ; unsigned char* cptr = (unsigned char*)&c ; while(1) { scanf(“%d”,&c) ; printf(“Integer value: %u\n”,c); printf(“%u.%u.%u.%u \n”,*cptr, *(cptr+1), *(cptr+2), *(cptr+3) ); } } 此代码为输入2249459722提供了错误的输出。 但当我更换 scanf(“%d”,&c) ; 通过 scanf(“%u”,&c) ; 输出结果是正确的。 PS :我知道inet_ntop和inet_pton 。 我期待的答案不是建议那些答案。

在套接字上发送一个结构,在C中使用正确的填充和字节序

我有几个结构定义为通过不同的操作系统(tcp网络)发送。 定义的结构是: struct Struct1 { uint32_t num; char str[10]; char str2[10];} struct Struct2 { uint16_t num; char str[10];} typedef Struct1 a; typedef Struct2 b; 数据存储在文本文件中。 数据格式如下: 123 馅饼 脆皮 Struct1a存储为3个单独的参数。 但是,struct2是两个独立的参数,第二行和第三行都存储在char str []中。 问题是当我通过多个网络写入服务器时,数据未正确接收。 有许多空间可以分隔结构中的不同参数。 当我写入服务器时,如何确保正确的发送和填充? 如何正确存储数据(动态缓冲区或固定缓冲区)? write的例子:write(fd,&a,sizeof(typedef struct a)); 它是否正确? 问题接收struct2的侧输出: 123(,) 0(,馅饼) 0(地壳) 正确的输出 123(馅饼,地壳)

什么是在C中转换字符串顺序的可移植方式

我正在尝试编写可与任何可以建立套接字连接的标准客户端进行通信的服务器(例如telnet客户端) 它最初是一个echo服务器,当然不需要担心网络字节排序。 我熟悉ntohs,ntohl,htons,htonl函数。 如果我转移16位或32位整数,或者如果发送的字符串中的字符是2或4字节的倍数,那么它们本身就会很好。 我想创建一个对字符串进行操作的函数,例如: str_ntoh(char* net_str, char* host_str, int len) { uint32_t* netp, hostp; netp = (uint32_t*)&net_str; for(i=0; i < len/4; i++){ hostp[i] = ntoh(netp[i]); } } 或类似的东西。 上面的假设是单词大小为32位。 我们不能确定发送机器上的字数不是16位还是64位正确? 对于客户端程序,例如telnet,他们必须在发送之前使用hton *,在接收数据之后使用ntoh *,对吗? 编辑:对于那些人而言,因为1-char是一个字节,字节序无关紧要: int main(void) { uint32_t a = 0x01020304; char* c = (char*)&a; printf(“%x %x %x %x\n”, c[0], c[1], c[2], c[3]); } […]

更改字节序的最快方法

什么是反转16位和32位整数的字节顺序的最快方法。 我经常做类似的事情(这个编码是在C ++的Visual Studio中完成的): union bytes4 { __int32 value; char ch[4]; }; union bytes2 { __int16 value; char ch[2]; }; __int16 changeEndianness16(__int16 val) { bytes2 temp; temp.value=val; char x= temp.ch[0]; temp.ch[0]=temp.ch[1]; temp.ch[1]=x; return temp.value; } __int32 changeEndianness32(__int32 val) { bytes4 temp; temp.value=val; char x; x= temp.ch[0]; temp.ch[0]=temp.ch[1]; temp.ch[1]=x; x= temp.ch[2]; temp.ch[2]=temp.ch[3]; temp.ch[3]=x; return temp.value; } […]

便携式C二进制序列化原语

据我所知,C库没有帮助将数值序列化为非文本字节流。 如我错了请纠正我。 使用的最标准工具是来自POSIX的htonl等人。 这些function有缺点: 没有64位支持。 没有浮点支持。 签名类型没有版本。 反序列化时,无符号到符号的转换依赖于有符号整数溢出,即UB。 它们的名称没有说明数据类型的大小。 它们依赖于8位字节和精确大小的uint_ N _t的存在。 输入类型与输出类型相同,而不是引用字节流。 这要求用户执行指针类型转换,这可能在对齐时不安全。 执行该类型转换后,用户可能会尝试在其本机内存布局中转换和输出结构,这种做法很糟糕,导致意外错误。 用于将任意大小的char化为8位标准字节的接口将落在C标准之间,该标准不真正确认8位字节,并且无论标准(ITU?)将八位位组设置为基本传输单位。 但旧的标准没有得到修订。 现在C11有许多可选组件,可以添加二进制序列化扩展以及线程之类的东西,而不需要对现有实现提出要求。 这样的扩展是否有用,或者担心非二进制补充机器是否毫无意义?

网络字节顺序和字节顺序问题

我在互联网上读到,网络的标准字节顺序是大端,也称为网络字节顺序。 在网络上传输数据之前,首先将数据转换为网络字节顺序(大端)。 但任何人都可以告诉我谁将负责这次转换。 代码开发人员是否真的担心这种字节序? 如果是,请您告诉我们需要注意的示例(如果是C,C ++)。

在C中安全地将char *加倍

在我写的一个开源程序中,我正在从文件中读取二进制数据(由另一个程序编写)并输出整数,双精度数和其他各种数据类型。 其中一个挑战是它需要在两个端点的32位和64位机器上运行,这意味着我最终不得不做一些低级别的bit-twiddling。 我知道(非常)关于类型惩罚和严格别名的一点点,并且想要确保我正确地做事。 基本上,很容易从char *转换为各种大小的int: int64_t snativeint64_t(const char *buf) { /* Interpret the first 8 bytes of buf as a 64-bit int */ return *(int64_t *) buf; } 我有一组支持函数来根据需要交换字节顺序,例如: int64_t swappedint64_t(const int64_t wrongend) { /* Change the endianness of a 64-bit integer */ return (((wrongend & 0xff00000000000000LL) >> 56) | ((wrongend & 0x00ff000000000000LL) >> 40) […]