C语言unsigned long 转换拆分

问题遇到的现象和发生背景

C语言将一个long的4个字节a b c d拆分成d c b a并且组回去,比如0x5f05变成0x055f

遇到的现象和发生背景,请写出第一个错误信息
用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%
运行结果及详细报错内容
我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%

位运算用左移8位或者用除法取模这种256来做

我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”

可以使用位运算将long类型的4个字节拆分并组回去。

1.使用位运算:

long num = 0x5f05;
unsigned char a, b, c, d;
a = (num & 0xff000000) >> 24;
b = (num & 0x00ff0000) >> 16;
c = (num & 0x0000ff00) >> 8;
d = (num & 0x000000ff);
num = (d << 24) | (c << 16) | (b << 8) | a;


2.使用除法取模:

long num = 0x5f05;
unsigned char a, b, c, d;
a = num / (256*256*256);
num = num % (256*256*256);
b = num / (256*256);
num = num % (256*256);
c = num / 256;
d = num % 256;
num = (d << 24) | (c << 16) | (b << 8) | a;


这两种方法都能实现将long类型的4个字节拆分并组回去。位运算要比除法取模运算快。

自己写个移位运算当然是可以的
但是更简单的办法其实是利用union将它拆成char数组,然后你交换char,再重新拿传进去的long就行了

abcd变为dcba,怎么是5f05变成055f呢?

可以使用位运算来实现unsigned long类型的字节拆分和重组。

首先,可以使用位移运算符(>>和​1
Malformed citation <<)将每个字节拆分出来。例如,将unsigned long x = 0x5f05; 拆分成四个字节,可以使用以下代码:

unsigned char a = (x >> 24) & 0xff;
unsigned char b = (x >> 16) & 0xff;
unsigned char c = (x >>
​ 8) & 0xff;
unsigned char d = x & 0xff;
然后,可以使用位或运算符(|)将这四个字节重新组合成一个unsigned long值。例如,将这四个字节重新组合为unsigned long y,可以使用以下代码:

unsigned long y = (d << 24) | (c << 16) | (b << 8) | a;

```
其中 &0xff 是将高8位置0,取最低8位,后面的位移是将数字的二进制移动到对应的位置

最后将y的值就是你要的结果了, y = 0x055f

提供参考方法:C语言-实现各进制间的相互转换,链接:https://blog.csdn.net/ScatTereds/article/details/128009735

0x5f05变成0x055f
你这就是字节序问题

unsigned short a=0x5f05;
unsigned short b;
b=htons(a);

long L=12345;
char *c=(char *)&L;
...
FILE *fp;
...
fwrite(&c[0],1,1,fp);
fwrite(&c[1],1,1,fp);
...
fclose(fp);

这是典型的主机字节序和网络字节序互转,可以直接使用socket网络编程的api函数,参见下列示例代码

#include <winsock2.h>

#pragma  comment(lib, "ws2_32.lib")

int main()
{
    //把unsigned long类型从主机序转换到网络序
    unsigned long a = 0x01020304;
    unsigned long b = htonl(a);

    //把unsigned long类型从网络序转换到主机序
    //unsigned long ntohl(unsigned long netlong);

    //把unsigned short类型从主机序转换到网络序
    unsigned short c = 0x5f05;
    unsigned short d = htons(c);

    //把uint16_t类型从网络序转换到主机序
    //unsigned short ntohs(unsigned short netshort);

    system("pause");

    return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^