今天看到了一段非常漂亮的代码,但是看了半天,还是不理解, 于是画图解决了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
/* * convert big endian to little endian in C */ uint16_t swap_uint16( uint16_t val ); int16_t swap_int16( int16_t val ); uint32_t swap_uint32( uint32_t val ); int32_t swap_int32( int32_t val ); int64_t swap_int64( int64_t val ); uint64_t swap_uint64( uint64_t val ); //! Byte swap unsigned short uint16_t swap_uint16( uint16_t val ) { return (val << 8) | (val >> 8 ); } //! Byte swap short int16_t swap_int16( int16_t val ) { return (val << 8) | ((val >> 8) & 0xFF); } //! Byte swap unsigned int uint32_t swap_uint32( uint32_t val ) { val = ((val << 8) & 0xFF00FF00 ) | ((val >> 8) & 0xFF00FF ); return (val << 16) | (val >> 16); } //! Byte swap int int32_t swap_int32( int32_t val ) { val = ((val << 8) & 0xFF00FF00) | ((val >> 8) & 0xFF00FF ); return (val << 16) | ((val >> 16) & 0xFFFF); } int64_t swap_int64( int64_t val ) { val = ((val << 8) & 0xFF00FF00FF00FF00ULL ) | ((val >> 8) & 0x00FF00FF00FF00FFULL ); val = ((val << 16) & 0xFFFF0000FFFF0000ULL ) | ((val >> 16) & 0x0000FFFF0000FFFFULL ); val = (val << 32) | ((val >> 32) & 0xFFFFFFFFULL); return val; } uint64_t swap_uint64( uint64_t val ) { val = ((val << 8) & 0xFF00FF00FF00FF00ULL ) | ((val >> 8) & 0x00FF00FF00FF00FFULL ); val = ((val << 16) & 0xFFFF0000FFFF0000ULL ) | ((val >> 16) & 0x0000FFFF0000FFFFULL ); val = (val << 32) | (val >> 32); return val; } |
简单举个例子:
如AABB CCDD
1、BBAA DDCC
2、DDCC BBAA
如AABB CCDD EEFF GGHH
1、BBAA DDCC FFEE HHGG
2、DDCC BBAA HHGG FFEE
3、HHGG FFEE DDCC BBAA
这个转换都是基于byte,最小单位为byte。一般是先进行8位为一个单位的调换,然后是16位,然后是32位。
声明: 本文由( liva )原创编译,转载请保留链接: 大小端字节转换代码研究
- 上一篇:一款我们每天都在使用的远程控制软件
- 下一篇:360公共库-加速博客访问速度
大小端字节转换代码研究:等您坐沙发呢!
发表评论
