标签: endianness

在C++程序中以编程方式检测字节顺序

是否有一种编程方式来检测您是否在大端或小端架构上?我需要能够编写将在Intel或PPC系统上执行的代码并使用完全相同的代码(即没有条件编译).

c++ algorithm endianness

201
推荐指数
14
解决办法
10万
查看次数

如何在C++中的big-endian和little-endian值之间进行转换?

如何在C++中的big-endian和little-endian值之间进行转换?

编辑:为清楚起见,我必须将二进制数据(双精度浮点值和32位和64位整数)从一个CPU架构转换为另一个CPU架构.这不涉及网络,因此ntoh()和类似的功能在这里不起作用.

编辑#2:我接受的答案直接适用于我正在编制的编译器(这就是我选择它的原因).但是,这里有其他非常好的,更便携的答案.

c++ endianness

187
推荐指数
14
解决办法
27万
查看次数

位移是否取决于字节序?

假设我有'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'步骤以更好地理解处理]

  1. 对待没有.在Big-Endian公约中:

    00000000        00000000        00000100    00000001
    
    Run Code Online (Sandbox Code Playgroud)
  2. 应用左移:

    00000000        00010000        00000100        00000000
    
    Run Code Online (Sandbox Code Playgroud)
  3. 再次在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与预期结果不同.

c endianness

146
推荐指数
5
解决办法
3万
查看次数

在Java中将字节数组转换为整数,反之亦然

我想将一些数据存储到Java中的字节数组中.基本上只是每个数字最多可以占用2个字节的数字.

我想知道如何将整数转换为2字节长字节数组,反之亦然.我发现了很多解决方案谷歌搜索,但大多数都没有解释代码中发生了什么.有很多变化的东西,我真的不明白,所以我很感激一个基本的解释.

java types endianness

128
推荐指数
5
解决办法
26万
查看次数

C宏定义确定大端或小端机?

是否有一行宏定义来确定机器的字节顺序.我使用以下代码,但将其转换为宏将太长.

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)

c architecture macros endianness

101
推荐指数
13
解决办法
9万
查看次数

Java是以小端还是大端读取整数?

我问,因为我正在从C进程向Java发送字节流.在C端,32位整数的LSB是第一个字节,MSB是第4个字节.

所以我的问题是:在Java端,当我们读取从C进程发送的字节时,Java端的endian是什么?

一个后续问题:如果Java端的endian与发送的端不一样,我怎样才能在它们之间进行转换?

java endianness

92
推荐指数
4
解决办法
11万
查看次数

这个程序如何运作?

#include <stdio.h>

int main() {
    float a = 1234.5f;
    printf("%d\n", a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它显示0!! 怎么可能?是什么原因?


我故意%dprintf声明中加入研究行为printf.

c c++ memory printf endianness

88
推荐指数
6
解决办法
6790
查看次数

在C中将大端转换为小端[不使用提供的函数]

我需要在C中编写一个将big endian转换为little endian的函数.我不能使用任何库函数.

c swap endianness

87
推荐指数
9
解决办法
33万
查看次数

为什么网络字节顺序被定义为big-endian?

正如标题中所写,我的问题是,为什么TCP/IP在传输数据时使用大端编码而不是替代的小端方案?

networking network-protocols endianness tcp-ip

83
推荐指数
1
解决办法
4万
查看次数

C/C++:强制位域顺序和对齐

我读到结构中位字段的顺序是特定于平台的.如果我使用不同的特定于编译器的打包选项,这将保证数据在写入时以正确的顺序存储吗?例如:

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是.如果我找到各种编译器的等效结构包装选项,这将是跨平台的吗?

c c++ bit-manipulation endianness bit

81
推荐指数
5
解决办法
7万
查看次数