Tag: 字节序

用联合检测endianess是否安全?

换句话说,根据C 标准 ,这段代码是否安全? (假设uint8_t是一个字节) void detectEndianness(void){ union { uint16_t w; uint8_t b; } a; aw = 0x00FFU; if (ab == 0xFFU) { puts(“Little endian.”); } else if (ab == 0U) { puts(“Big endian.”); } else { puts(“Stack Overflow endian.”); } } 如果我把它改成这个怎么办? 注意第三个我知道的情况。 aw = 1U; if (ab == 1U) { puts(“Little endian.”); } else […]

在C中使用大量字符的字节顺序

嘿伙计们,来自C / Networking新手的问题…… 我在C中进行一些套接字编程,并试图解决字节顺序问题。 我的请求(发送)很好,但是当我收到数据时,我的字节都乱了。 我从这样的事情开始…… char * aResponse= (char *)malloc(512); int total = recv(sock, aResponse, 511, 0); 在处理这个响应时,每个16位字似乎都反转了它(我正在使用UDP)。 我试图通过做这样的事来解决这个问题…… unsigned short * _netOrder= (unsigned short *)aResponse; unsigned short * newhostOrder= (unsigned short *)malloc(total); for (i = 0; i < total; ++i) { newhostOrder[i] = ntohs(_netOrder[i]); } 当我将数据视为一个short时,这可以正常工作,但是如果我再次将指针转换为char,则字节会反转。 我究竟做错了什么? 谢谢!

位字节式如何影响C中的按位移位和文件IO?

让L和B成为两台机器。 L从LSB(最低有效位)到MSB(最高有效位)对其位进行排序,而B从MSB到LSB进行排序。 或者,换句话说, L使用Little Endian而B使用Big Endian 位 – 不要与字节排序混淆。 问题1已解决 : 我们正在编写以下希望可移植的代码: #include int main() { unsigned char a = 1; a <<= 1; printf("a = %d\n", (int) a); return 0; } 在L上 ,它会打印2,但B上会发生什么? 它会将1移出并打印0吗? 解决方案: 6.5.7中的C99定义表明,至少在无符号整数类型上, <<和>>将分别乘以并除以2。 问题2: 我们正在编写以下希望可移植的代码: 阅读程序: /* program READ */ #include int main() { FILE* fp; unsigned char a; fp […]

如何让GCC为没有内置的大端存储生成bswap指令?

我正在研究一个以大端格式将64位值存储到内存中的函数。 我希望我能编写可在小端和大端平台上运行的可移植C99代码,并让现代x86编译器自动生成bswap指令而不需要任何内置函数或内在函数 。 所以我开始使用以下function: #include void encode_bigend_u64(uint64_t value, void *vdest) { uint64_t bigend; uint8_t *bytes = (uint8_t*)&bigend; bytes[0] = value >> 56; bytes[1] = value >> 48; bytes[2] = value >> 40; bytes[3] = value >> 32; bytes[4] = value >> 24; bytes[5] = value >> 16; bytes[6] = value >> 8; bytes[7] = value; […]

键入cast char指向整数指针的指针

所以我看到了一些关于如何找到架构的字节序的例子。 假设我们有一个指向int数据类型的整数指针。 让我们说int值是0x010A0B12。 在小端架构中,最低有效字节(即12)将存储在最低内存地址中,对吧? 因此,4字节整数中的最低字节为12。 现在,检查。 如果我们声明一个char指针p,并输入将整数指针转换为char *并将其存储在p中,并打印取消引用的p值,我们将得到一个关于该结构的字节顺序的线索。 如果它是12,我们就是小尾数; 01表示大端。 听起来真的很整洁…… int a = 0x010A0B12; int *i = &a; char *p = (char*)i; printf(“%d”,*p); // prints the decimal equivalent of 12h! 这里有几个问题,真的。 由于指针是强类型的,字符指针不应该严格指向char数据类型吗? 用%d打印的是什么? 难道我们不应该用%c打印字符吗?

在C中读/写浮点类型时如何处理字节顺序差异?

我正在为我的应用程序设计一种文件格式,我显然希望它可以在big-endian和little-endian系统上运行。 我已经找到了使用htonl和ntohl来管理整数类型的工作解决方案,但是当我尝试使用float和double值进行相同操作时,我有点卡住了。 鉴于浮点表示如何工作的性质,我认为标准的字节顺序函数不适用于这些值。 同样,我甚至不完全确定传统意义上的字节顺序是否支配这些类型的字节顺序。 我需要的只是一致性。 写一个double出来的方法,并确保我在读回来时得到相同的值。我怎么能在C中做到这一点?