对网络包进行压缩可以减少网络带宽,提高传输效率, 很多时候一些报文中包含一些无符号整数,比如报文头中的长度信息.正常情况下一个无符号整数占用32位
从0x0000 0000 到 0xFFFF FFFF .
由于一个无符号整数始终占据着4字节内存,就算是1也会占据着4个字节,其实只要1字节就可以保存了.(要想压缩整数,基本算法思想是压缩在4字节之内也就是1,2,3,4.
把无符号整数进行逻辑分段:
通过上面可以大致看出1~4字节的逻辑分层.把无符号整数进行压缩在一个字符数组内,定义一个char buf[4];
当在0x00~0xFF之间时:
因为是只有1个字节只要保存在buf[0] 这个字符内。
当在0x100~0xFFFF之间时:
这个范围是2个字节,把前8位保存于数组buf[0]内,后8位保存于数组buf[1]内 。通过位操作即可。
当在0x100~0xFFFFFF之间时也类似。
当在0x1000000 ~ 0xFFFFFFFF这个范围不进行压缩。因为必须占用4个字节,所以没什么意义。
下面看下压缩代码:
对压缩过的数据进行解压缩,只要和压缩操作相反就可以了。不过要特别注意符号位的问题!
压缩图示:
如果你使用的Python,你可以从struct.pack这个方法进行入手。
比如:压缩2个字节:
解压缩进行upack即可:
还有种算法是通过每7位一保存。前面1位为符号位(非有符号的符号位,而是如果为0表示后面没有数据,1表示有数据)
如果检查为1 表示后面7位需要和下面一段数据进行拼接,0表示后面7位为最后7位。 所以可能压缩后位1~5字节内。
解压缩:
Python实现压缩与解压缩:( 本段程序,参考http://www.cnblogs.com/AndersLiu/archive/2010/02/09/compressed-integer-in-metadata.html)
另外需要注意的是 Python返回后的是个元祖 需要 用 .value来取值
图示:
-> 1000 0001 | 0000 0000
关于压缩和解压缩(Include Integer) 更多信息可以读下面一篇文章:
http://www.cs.tut.fi/~albert/Dev/pucrunch/packing.html
分享到:
相关推荐
提供了一种将uint32_t格式的数据转换为int格式数据的方法,在点云数据转换等领域具有一定的实际应用意义。
如果内存中有很多不经常使用的相对较小的稀疏矩阵,则此包特别有用。 通过打包矩阵,减少了内存使用。 下一步,可以使用 GZIP 压缩... 支持的格式是logical/int8/uint8/int16/uint16/int32/uint32/single/double/patter
支持的功能 double / float字段 int32 / int64 / uint32 / uint64 / sint32 / sint64 / fixed32 / fixed64 / sfixed32 / sfixed64字段 bool场 string字段 bytes字段 讯息栏位 枚举字段 进口 嵌套类型 Any类型 ...
C#中的uint是无符号整数类型,int是有符合整数类型。两者的取值范围不相同,那么,如何将uint值转换为int呢? 打开visual studio,创建一个控制台应用程序,本文的所有代码都在Program.cs文件的Main方法中进行演示。...
SHA512算法实现,使用uint32实现,适用于32位MCU,SHA512算法实现,使用uint32实现,适用于32位MCU
#define UINT32 unsigned long #define UINT8X unsigned char xdata #define UINT8VX unsigned char volatile xdata UINT8VX CH375_CMD_PORT _at_ 0x9FF1; /* CH375命令端口的I/O地址 */ UINT8VX CH375_DAT_...
int和uint类型在我们日常开发中经常会用到,但有个疑问就是这两个类型有多大,通过各种尝试最终得到了答案,所以下面这篇文章主要给大家介绍了关于Golang中的int类型和uint类型到底有多大的相关资料,文中通过示例...
srclen, dstlen, keymapLen uint32 //源文件字符个数 压缩文件字符个数 哈夫曼编码字符映射个数 patchBit uint8 //压缩后不足8bit补0个数 keysMap map[interface{}]uint32 //字符统计构建哈夫曼树 } 压缩实现过程...
#define uint unsigned int//定义无符号整数变量类型 #define uchar unsigned char//无符号字符变量类型 uchar code LED[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//共阳极段码表说明....
把从串口等地方获得的数据转换成int32类型数据
uint8_t ver:4; /* 消息版本号 */ uint8_t sub_ver:4; /* 消息子版本号 */ uint8_t cont_flag:1;/* 是否有后续包标志 0:没有 1:有 */ uint8_t type:7; /* 消息类型 */ uint16_t event; /* 消息事件号 */ uint...
void sha256_get(uint8_t hash[32], const uint8_t *message, int length);/*此函数用于对消息计算摘要值,输入任意大小消息,输出32字节摘要值*/ void hmac_sha256_get(uint8_t digest[32], uint8_t *message, int...
做这个转换每每耗费很多时间,分大小端写了两个函数,测试正确,记录一下,以后直接就用了,也分享给有需要的小伙伴
描述在使用C语言进行编程时经常遇到的数据类型间的相互转换问题。
该函数将使用“Flatten To XML”和“Write to XML File”VI 创建的 XML 文件转换为结构数组,使用... 整数以其正确的类型导入,即 I8/I16/I32/I64/U8/U16/U32/U64 类型的控件被导入为 int8/int16/int32/int64/uint8/ui
Uint32 USBTimeOut = 0x0400; BOOL ReadFlag; static Uint8 setupCnt = 0; static BOOL setupDat = False; /* global variables */ Uint8 irqValue; /* interrupt register value */ Uint8 SetupBuff[8]; /* ...
智力 返回指定整数类型的最小值。...int32 : 有符号的 32 位整数 uint32 : 无符号 32 位整数 如果未提供整数type ,则该函数返回最小的有符号 32 位整数。 intmin ( ) === intmin ( 'int32' ) ;
位5-位4为数据读写宽度: 00=以字节为单位/8位, 01=以字为单位/16位, 10=以双字为单位/32位, 11=以位为单位/1位 位1-位0为存储器空间: 00=存取SFR, 01=存取内部RAM, 10=存取外部RAM, 11=存取程序ROM 例如: 命令码...
public enum BOARD_TYPE_DS : uint { DS400XM = 0, //M卡 DS400XH = 1, //H卡 DS4004HC = 2, //4004HC DS4008HC = 3, //4008HC DS4016HC = 4, //4016HC DS4001HF = 5, //4001HF DS4004HF = 6, //4004HF DS...
基本类型 1.基本类型列表 代码如下: 类型 长度 说明 bool 1 true/false,默认false, 不能把非0值当做true(不用数字代表true/false) byte 1 uint8 别名 rune 4 int32别名。...int16/uint16 2 -32768 ~