C语言将一个long的4个字节a b c d拆分成d c b a并且组回去,比如0x5f05变成0x055f
位运算用左移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;
}
不知道你这个问题是否已经解决, 如果还没有解决的话: