如何在C++中的big-endian和little-endian值之间进行转换?
编辑:为清楚起见,我必须将二进制数据(双精度浮点值和32位和64位整数)从一个CPU架构转换为另一个CPU架构.这不涉及网络,因此ntoh()和类似的功能在这里不起作用.
编辑#2:我接受的答案直接适用于我正在编制的编译器(这就是我选择它的原因).但是,这里有其他非常好的,更便携的答案.
我只是想问一下我的方法是否正确,从小端到大端转换,只是为了确保我理解差异.
我有一个存储在little-endian中的数字,这里是数字的二进制和十六进制表示:
?0001 0010 0011 0100 0101 0110 0111 1000?
?12345678?
Run Code Online (Sandbox Code Playgroud)
在big-endian格式中,我认为应该交换字节,如下所示:
1000 0111 0110 0101 0100 0011 0010 0001
?87654321
Run Code Online (Sandbox Code Playgroud)
它是否正确?
此外,下面的代码尝试执行此操作但失败.有什么明显的错误或者我可以优化一些东西吗?如果代码对于此转换有害,请解释原因并展示执行相同转换的更好方法吗?
uint32_t num = 0x12345678;
uint32_t b0,b1,b2,b3,b4,b5,b6,b7;
uint32_t res = 0;
b0 = (num & 0xf) << 28;
b1 = (num & 0xf0) << 24;
b2 = (num & 0xf00) << 20;
b3 = (num & 0xf000) << 16;
b4 = (num & 0xf0000) << 12;
b5 = (num & 0xf00000) << 8;
b6 = (num & 0xf000000) …Run Code Online (Sandbox Code Playgroud) 在SO上,有很多关于性能分析的问题,但我似乎没有找到整体情况.涉及到相当多的问题,大多数问答都会忽略所有问题,但不能忽视其中的一些问题.
我想知道什么.如果我有两个功能做同样的事情,我很好奇速度的差异,没有外部工具,定时器测试这个是否有意义,或者在测试中编译会影响结果吗?
我问这个是因为如果它是明智的,作为一个C++程序员,我想知道它应该如何做到最好,因为它们比使用外部工具简单得多.如果它有意义,让我们继续讨论所有可能的陷阱:
考虑这个例子.以下代码显示了执行相同操作的两种方法:
#include <algorithm>
#include <ctime>
#include <iostream>
typedef unsigned char byte;
inline
void
swapBytes( void* in, size_t n )
{
for( size_t lo=0, hi=n-1; hi>lo; ++lo, --hi )
in[lo] ^= in[hi]
, in[hi] ^= in[lo]
, in[lo] ^= in[hi] ;
}
int
main()
{
byte arr[9] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' };
const int iterations = 100000000;
clock_t begin = clock();
for( int i=iterations; i!=0; --i )
swapBytes( arr, 8 );
clock_t …Run Code Online (Sandbox Code Playgroud) iOS的objective-c库中是否有内置的实用程序或宏,允许您在endianess方面将字节转换为整数?
请不要告诉我使用位移操作.我试图避免编写自定义代码来执行此操作,如果它已经存在.
我希望代码将NSData*转换为原始类型(int,uint,short等)并将原始类型转换回NSData*.
我想int32_t以大端顺序将 an 的 4 个字节写入二进制文件。我fwrite()直接使用指向 my 的指针int32_t,它有些工作,但问题是我的整数是按小端顺序写入的,首先写入最小的字节。例如,如果我写:
int32_t specialInt = 262;
fwrite(&specialInt, 4, 1, myFile);
Run Code Online (Sandbox Code Playgroud)
我用十六进制编辑器打开它,我看到:
06 01 00 00 ...
Run Code Online (Sandbox Code Playgroud)
这与我想要的方式相比是倒退的。我想:
00 00 01 06 ...
Run Code Online (Sandbox Code Playgroud)
我应该如何让我的int_32t顺序处于大端顺序?是否有一个内置的 C 库函数可以按正确的顺序获取字节,或者我应该使用将memcpy()字节放入临时字符数组中,然后将字节一一向后写入文件中?
我想通过其I2S外设从STM32(Cortex M4)设备发送数据,使用24位模式的DMA,MSB优先.然而,I2S数据寄存器只有16位,根据数据表,您必须首先发送上半字,然后是下半字.这在使用DMA时会出现问题,它将始终首先发送下半字.
在c或ARM-assembler中切换两个半字的有效方法是什么?
我正在使用fread读取文件的第一个字节:
fread(&example_struct, sizeof(example_struct), 1, fp_input);
Run Code Online (Sandbox Code Playgroud)
哪个在linux和solaris下结果不同?那么example_struct(Elf32_Ehdr)是elf.h中定义的Standart GNU C Liborary的一部分?我很高兴知道为什么会这样?
一般结构看起来如下:
typedef struct
{
unsigned char e_ident[LENGTH];
TYPE_Half e_type;
} example_struct;
Run Code Online (Sandbox Code Playgroud)
调试代码:
for(i=0;paul<sizeof(example_struct);i++){
printf("example_struct->e_ident[%i]:(%x) \n",i,example_struct.e_ident[i]);
}
printf("example_struct->e_type: (%x) \n",example_struct.e_type);
printf("example_struct->e_machine: (%x) \n",example_struct.e_machine);
Run Code Online (Sandbox Code Playgroud)
Solaris输出:
Elf32_Ehead->e_ident[0]: (7f)
Elf32_Ehead->e_ident[1]: (45)
...
Elf32_Ehead->e_ident[16]: (2)
Elf32_Ehead->e_ident[17]: (0)
...
Elf32_Ehead->e_type: (200)
Elf32_Ehead->e_machine: (6900)
Run Code Online (Sandbox Code Playgroud)
Linux输出:
Elf32_Ehead->e_ident[0]: (7f)
Elf32_Ehead->e_ident[1]: (45)
...
Elf32_Ehead->e_ident[16]: (2)
Elf32_Ehead->e_ident[17]: (0)
...
Elf32_Ehead->e_type: (2)
Elf32_Ehead->e_machine: (69)
Run Code Online (Sandbox Code Playgroud)
也许类似于:http://forums.devarticles.com/cc-help-52/file-io-linux-and-solaris-108308.html
我正在研究endianess.我的小端程序工作,并给出正确的输出.但我无法绕过大端.以下是我到目前为止所拥有的内容.我知道我必须使用位移,我不认为我做得很好.我试过询问我的TA和教授,但他们帮助不大.我一直在关注这个链接(在C中将big endian转换为little endian [不使用提供的func])以了解更多但仍然无法使其工作.感谢您的帮助.
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
FILE* input;
FILE* output;
input = fopen(argv[1],"r");
output = fopen(argv[2],"w");
int value,value2;
int i;
int zipcode, population;
while(fscanf(input,"%d %d\n",&zipcode, &population)!= EOF)
{
for(i = 0; i<4; i++)
{
population = ((population >> 4)|(population << 4));
}
fwrite(&population, sizeof(int), 1, output);
}
fclose(input);
fclose(output);
return 0;
}
Run Code Online (Sandbox Code Playgroud)