是否有一种编程方式来检测您是否在大端或小端架构上?我需要能够编写将在Intel或PPC系统上执行的代码并使用完全相同的代码(即没有条件编译).
如何在C++中的big-endian和little-endian值之间进行转换?
编辑:为清楚起见,我必须将二进制数据(双精度浮点值和32位和64位整数)从一个CPU架构转换为另一个CPU架构.这不涉及网络,因此ntoh()和类似的功能在这里不起作用.
编辑#2:我接受的答案直接适用于我正在编制的编译器(这就是我选择它的原因).但是,这里有其他非常好的,更便携的答案.
假设我有'numb'=1025 [00000000 00000000 00000100 00000001]
代表的数字:
在Little-Endian机器上:
00000001 00000100 00000000 00000000
Run Code Online (Sandbox Code Playgroud)
在Big-Endian机器上:
00000000 00000000 00000100 00000001
Run Code Online (Sandbox Code Playgroud)
现在,如果我在10位上应用Left Shift(即:numb << = 10),我应该:
[A]在Little-Endian机器上:
正如我在GDB中注意到的那样,Little Endian通过3个步骤执行左移:[我已经显示'3'步骤以更好地理解处理]
对待没有.在Big-Endian公约中:
00000000 00000000 00000100 00000001
Run Code Online (Sandbox Code Playgroud)应用左移:
00000000 00010000 00000100 00000000
Run Code Online (Sandbox Code Playgroud)再次在Little-Endian中表示结果:
00000000 00000100 00010000 00000000
Run Code Online (Sandbox Code Playgroud)[B].在Big-Endian机器上:
00000000 00010000 00000100 00000000
Run Code Online (Sandbox Code Playgroud)
我的问题是:
如果我直接在Little Endian公约上应用左移,它应该给:
numb
:
00000001 00000100 00000000 00000000
Run Code Online (Sandbox Code Playgroud)
numb << 10
:
00010000 00000000 00000000 00000000
Run Code Online (Sandbox Code Playgroud)
但实际上,它给出了:
00000000 00000100 00010000 00000000
Run Code Online (Sandbox Code Playgroud)
为了达到第二个结果,我在上面展示了三个假设步骤.
请解释一下为什么上述两个结果不同:实际结果numb << 10
与预期结果不同.
我想将一些数据存储到Java中的字节数组中.基本上只是每个数字最多可以占用2个字节的数字.
我想知道如何将整数转换为2字节长字节数组,反之亦然.我发现了很多解决方案谷歌搜索,但大多数都没有解释代码中发生了什么.有很多变化的东西,我真的不明白,所以我很感激一个基本的解释.
是否有一行宏定义来确定机器的字节顺序.我使用以下代码,但将其转换为宏将太长.
unsigned char test_endian( void )
{
int test_var = 1;
unsigned char test_endian* = (unsigned char*)&test_var;
return (test_endian[0] == NULL);
}
Run Code Online (Sandbox Code Playgroud) #include <stdio.h>
int main() {
float a = 1234.5f;
printf("%d\n", a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它显示0
!! 怎么可能?是什么原因?
我故意%d
在printf
声明中加入研究行为printf
.
我需要在C中编写一个将big endian转换为little endian的函数.我不能使用任何库函数.
正如标题中所写,我的问题是,为什么TCP/IP在传输数据时使用大端编码而不是替代的小端方案?
我读到结构中位字段的顺序是特定于平台的.如果我使用不同的特定于编译器的打包选项,这将保证数据在写入时以正确的顺序存储吗?例如:
struct Message
{
unsigned int version : 3;
unsigned int type : 1;
unsigned int id : 5;
unsigned int data : 6;
} __attribute__ ((__packed__));
Run Code Online (Sandbox Code Playgroud)
在具有GCC编译器的英特尔处理器上,字段在显示时显示在内存中.Message.version
是缓冲区中的前3位,然后Message.type
是.如果我找到各种编译器的等效结构包装选项,这将是跨平台的吗?
endianness ×10
c ×5
c++ ×4
java ×2
algorithm ×1
architecture ×1
bit ×1
macros ×1
memory ×1
networking ×1
printf ×1
swap ×1
tcp-ip ×1
types ×1