Tag: endianness

签名右移=奇怪的结果?

我正在帮助某人完成他们的功课,并遇到了这个奇怪的问题。 问题是编写一个函数来反转有符号整数的字节顺序(这就是函数的指定方式),这就是我提出的解决方案: int reverse(int x) { int reversed = 0; reversed = (x & (0xFF <> 24; reversed |= (x & (0xFF <> 8; reversed |= (x & (0xFF << 8)) << 8; reversed |= (x & 0xFF) << 24; return reversed; } 如果将0xFF000000传递给此函数,则第一个赋值将导致0xFFFFFFFF 。 我真的不明白发生了什么,但我知道它与签名和未签名之间的来回转换有关,或类似的东西。 如果我将ul附加到0xFF它工作正常,我认为这是因为它被强制为无符号然后转换为signed或那个方向的东西。 结果代码也会改变; 没有ul说明符它使用sar(右移算术),但是作为无符号它使用shr按预期。 如果有人能为我阐明这一点,我将非常感激。 我应该知道这些东西,我以为我做了,但我真的不确定这里发生了什么。 提前致谢!

如何从网络管理双重的结束

我对这个问题的答案有一个大问题。 在c ++中交换双位的比特 然而,这个问题或多或少都是我搜索的:我从网络上收到一个双,我想在我的机器上正确编码。 在我收到int的情况下,我使用ntohl执行此代码: int * piData = reinterpret_cast((void*)pData); //manage endianness of incomming network data unsigned long ulValue = ntohl(*piData); int iValue = static_cast(ulValue); 但是在我得到double的情况下,我不知道该怎么做。 该问题的答案建议: template void swap_endian(T& pX) { char& raw = reinterpret_cast(pX); std::reverse(&raw, &raw + sizeof(T)); } 但是,如果我引用此网站 : The ntohl() function converts the unsigned integer netlong from network byte order […]

如何在具有big-endian架构的机器上测试代码?

ideone.com和codepad.org都有Little-Endian架构。 我想在Big-Endian架构的某台机器上测试我的代码(例如 – Solaris – 我没有)。 你知道一些简单的方法吗?

wchar_t数据是否需要字节序转换?

在C / C ++中,如果一个多字节宽字符(wchar_t)值从big-endian系统传输到little-endian系统(反之亦然),它会在另一端出现相同的值吗? 或者需要交换字节?

将UINT32值转换为UINT8数组

我的问题是你如何将UINT32值转换为UINT8数组[4](C / C ++),最好是以独立于字节序的方式? 另外,如何从UINT8数组[4]重建UINT32值,以回到你开始的位置?

你如何编写(便携式)反向网络字节顺序?

背景 在设计二进制文件格式时,通常建议以网络字节顺序写入整数。 为此,有像htonhl()这样的宏。 但对于像WAV这样的格式,实际上使用的是小端格式。 题 无论你的代码运行的CPU是大端还是小端架构,你如何便携地编写小端值? (想法:标准宏ntohl()和htonl()可以以某种方式“反向”使用吗?或者如果代码只是运行在一个小端或大端的CPU上并选择适当的代码路径,那么它应该只测试运行时吗?) 所以问题不在于文件格式,文件格式只是一个例子。 它可以是任何类型的序列化,其中需要“线上”的小端,例如(异端)网络协议。

有没有办法为C或C ++结构强制执行特定的字节序?

我已经看到了关于结构的字节序的一些问题和答案,但它们是关于检测系统的字节序,或者在两个不同的字节序之间转换数据。 但是,如果有一种方法可以强制执行给定结构的特定字节顺序,那么我现在想要的是什么。 是否有一些好的编译器指令或其他简单的解决方案,除了重写操作在位域上的许多宏的整个事情? 一般的解决方案会很好,但我也会对特定的gcc解决方案感到满意。 编辑: 感谢所有评论指出为什么强制执行endianness不是一个好主意,但在我的情况下,这正是我需要的。 大量数据由特定处理器生成(永远不会改变,它是带有自定义硬件的嵌入式系统),并且必须由在未知处理器上运行的程序(我正在处理的)读取。 对数据进行字面评估会非常麻烦,因为它包含数百种不同类型的结构,这些结构非常庞大且深入:它们中的大多数都有许多其他巨大的结构层。 改变嵌入式处理器的软件是不可能的。 源是可用的,这就是为什么我打算使用该系统的结构而不是从头开始并按字节方式评估所有数据。 这就是为什么我需要告诉编译器它应该使用哪个字节序,无论效率与否都无关紧要。 它不一定是字节序的真正变化。 即使它只是一个接口,物理上所有东西都是在处理器自己的字节序中处理的,但我完全可以接受。

从char *数组中读取“整数”大小的字节。

我想从char*数组中读取sizeof(int)字节。 a)在什么情况下我们需要担心是否需要检查字节序? b)如何考虑或不考虑字节顺序,您将如何读取前4个字节。 编辑:我读过的sizeof(int)字节需要与整数值进行比较。 解决这个问题的最佳方法是什么?

如何将值从主机字节顺序转换为小端?

我需要将一个短值从主机字节顺序转换为小端。 如果目标是大端,我可以使用htons()函数,但唉 – 它不是。 我想我能做到: swap(htons(val)) 但是这可能会导致字节被交换两次,从而使结果正确但给我一个性能损失,这在我的情况下是不正确的。

检测字节序

我正在尝试创建一个C源代码,无论目标系统的字节顺序如何,它都能正确处理I / O. 我选择了“little endian”作为我的I / O约定,这意味着,对于大端CPU,我需要在写入或读取时转换数据。 转换不是问题。 我面临的问题是检测字节序,最好是在编译时(因为CPU在执行过程中不会改变字节序…)。 到目前为止,我一直在使用这个: #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ … #else … #endif 它被记录为GCC预定义宏,Visual似乎也理解它。 但是,我收到报告说某些big_endian系统(PowerPC)的检查失败了。 所以,我正在寻找一个万无一失的解决方案,确保无论编译器和目标系统如何都能正确检测到字节顺序。 好吧,他们中的大多数至少…… [编辑]:提出的大多数解决方案都依赖于“运行时测试”。 编译期间编译器有时可以正确评估这些测试,因此不会产生实际的运行时性能。 但是,使用某种<< if (0) { … } else { … } >>进行分支是不够的。 在当前的代码实现中,变量和函数声明依赖于big_endian检测。 使用if语句无法更改这些内容。 嗯,显然,有后备计划,即重写代码…… 我宁愿避免这种情况,但是,它看起来像是一个越来越小的希望…… [编辑2]:我通过深度修改代码测试了“运行时测试”。 尽管他们正确地完成了工作,但这些测试也会影响性能。 我期待着,因为测试具有可预测的输出,编译器可以消除坏分支。 但不幸的是,它并不是一直有效。 MSVC是一个很好的编译器,并且成功地消除了坏分支,但GCC的结果好坏,具体取决于版本,测试类型,以及对64位比对32位的影响更大。 真奇怪。 并且这也意味着无法确保编译器处理运行时测试。 编辑3 :这些天,我正在使用编译时常量联合,期望编译器将其解析为明确的是/否信号。 它运作得很好: https : //godbolt.org/g/DAafKo