如何对十六进制数的字节进行反转?

4

我想要反转十六进制数的字节,例如:

0x08090a0b 应该转换为 0x0b0a0908

我已经使用了这个宏。

#define REV(X)      ((X << 24) | (((X>>16)<<24)>>16) | (((X<<16)>>24)<<16) | (X>>24))

1
你达到了想要的目标了吗? - KARTHIK BHAT
1
这个问题真的与反转整数不同吗? - nav_jan
1
什么是问题?我只能看到在 sizeof(X) > 4 或者 X 是有符号时,那种方法存在问题。 - Aki Suihkonen
解决方案没有任何限制。我只想反转32位整数的字节顺序。输入为整数,输出也是整数。 - manish sardiwal
我已经实现了,但是有没有更简单的解决方案? - manish sardiwal
显示剩余2条评论
2个回答

2

如果你将移位和掩码结合起来,代码会更加简洁易懂:下面我展示完整表达式和其各个组成部分。请注意,在掩码中不需要前导零 - 我只是为了清晰/对齐而添加的。而且,在表达式的第一个和最后一个术语中不需要掩码,因为所有“不需要”的位都会从表达式中移出。

#define REV(X) ((X << 24) | (( X & 0xff00 ) << 8) | (( X >> 8) & 0xff00 ) | ( X >> 24 ))

一次一个字节:
#define R1(X) ((X & 0x000000ff ) << 24 )
#define R2(X) ((X & 0x0000ff00 ) <<  8 )
#define R3(X) ((X & 0x00ff0000 ) >>  8 )
#define R4(X) ((X & 0xff000000 ) >> 24 )

为了正确地打印出数字,请使用:
printf("%08x", REV(x));

这将确保前导零被打印出来。您必须确保您的输入是32位无符号整数,以便它能够正确工作。


非常简单的解释。致敬! - Gomu

0

请查看此链接 #

  int main(void) 
  {
     // your code goes here
     unsigned int X = 0x08090a0b;

     printf("%8x", ((X << 24) | (((X>>16)<<24)>>16) | (((X<<16)>>24)<<16) | (X>>24)));
     return 0;
  }

你的输出是正确的。你是说一开始没有显示0吗?

09 = 9 在你的情况下,x0b0a0908 = b0a0908


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接