大小端属于嵌入式软件开发最基本的内容了。但是对于很少进行位操作来说,总是会有些遗忘。
面试时候让我用宏定义写个大小端转换,,习惯了用ntohs等函数,脑子卡壳没写出来,工作几年,这玩意儿还不随手就来,耻辱柱记录一下。
一个16位整数,由2字节组成,内存存储数据有两种方法:
- 小端:将低序字节存储在起始地址(内存低地址)
- 大端:将高序字节存储在起始地址
注:Linux是小端
直接上例子,一个short类型的数据(2字节),先判断存储类型,再进行大小端操作。
操作系统为ubuntu 64。
#include#include //ntohs,ntohl,htons,htonl头文件 union num{ short n; char m[sizeof(short)]; }; void judge(union num a) { if (1 == a.m[0] && 2 == a.m[1]) { printf("bign"); } else if (2 == a.m[0] && 1 == a.m[1]) { printf("littlen"); } else { printf("judge ERROR!n"); } } int convert(union num* a) { a->n = ((a->n & 0xFF) << 8) | (a->n >> 8); printf("a->n = %Xn", a->n); return 0; } int main() { union num a; a.n = 0x0102; judge(a); convert(&a); a.n = ntohs(a.n); printf("a.n = %Xn", a.n); a.n = ntohs(a.n); printf("a.n = %Xn", a.n); a.n = htons(a.n); printf("a.n = %Xn", a.n); a.n = htons(a.n); printf("a.n = %Xn", a.n); return 0; }



