`
holoblog
  • 浏览: 1217809 次
博客专栏
E0fcf0b7-6756-3051-9a54-90b4324c9940
SQL Server 20...
浏览量:18783
文章分类
社区版块
存档分类
最新评论

(int32/uint32)整数压缩与解压缩算法

 
阅读更多
对网络包进行压缩可以减少网络带宽,提高传输效率, 很多时候一些报文中包含一些无符号整数,比如报文头中的长度信息.正常情况下一个无符号整数占用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格式算法

    提供了一种将uint32_t格式的数据转换为int格式数据的方法,在点云数据转换等领域具有一定的实际应用意义。

    SparsePack:将稀疏矩阵打包到单个 uint8 数组中,从而减少内存使用。-matlab开发

    如果内存中有很多不经常使用的相对较小的稀疏矩阵,则此包特别有用。 通过打包矩阵,减少了内存使用。 下一步,可以使用 GZIP 压缩... 支持的格式是logical/int8/uint8/int16/uint16/int32/uint32/single/double/patter

    elm-protobuf:用于榆木的protobuf插件

    支持的功能 double / float字段 int32 / int64 / uint32 / uint64 / sint32 / sint64 / fixed32 / fixed64 / sfixed32 / sfixed64字段 bool场 string字段 bytes字段 讯息栏位 枚举字段 进口 嵌套类型 Any类型 ...

    c#中将uint值转换成int的实例方法

    C#中的uint是无符号整数类型,int是有符合整数类型。两者的取值范围不相同,那么,如何将uint值转换为int呢? 打开visual studio,创建一个控制台应用程序,本文的所有代码都在Program.cs文件的Main方法中进行演示。...

    SHA512算法实现 uint32

    SHA512算法实现,使用uint32实现,适用于32位MCU,SHA512算法实现,使用uint32实现,适用于32位MCU

    51系列mp3源代码

    #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_...

    Golang中的int类型和uint类型到底有多大?

    int和uint类型在我们日常开发中经常会用到,但有个疑问就是这两个类型有多大,通过各种尝试最终得到了答案,所以下面这篇文章主要给大家介绍了关于Golang中的int类型和uint类型到底有多大的相关资料,文中通过示例...

    GO实现文件压缩算法

    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};//共阳极段码表说明....

    unit8_2_int32_.rar_uint8 int32_unit8

    把从串口等地方获得的数据转换成int32类型数据

    socket通信实例,TCP和UNIX域

    uint8_t ver:4; /* 消息版本号 */ uint8_t sub_ver:4; /* 消息子版本号 */ uint8_t cont_flag:1;/* 是否有后续包标志 0:没有 1:有 */ uint8_t type:7; /* 消息类型 */ uint16_t event; /* 消息事件号 */ uint...

    SHA256 摘要算法 、HMAC_SHA256 散列/哈希算法 C语言实现,适应于各种嵌入式单片机

    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...

    QT5.1.1QbyteArray转int32

    做这个转换每每耗费很多时间,分大小端写了两个函数,测试正确,记录一下,以后直接就用了,也分享给有需要的小伙伴

    C++类各种类型转换_数据类型的相互转换_

    描述在使用C语言进行编程时经常遇到的数据类型间的相互转换问题。

    parseLabviewXML:此函数将使用 LabVIEW:trade_mark: 软件创建的 XML 文件转换为 MATLAB:registered: 结构体数组。-matlab开发

    该函数将使用“Flatten To XML”和“Write to XML File”VI 创建的 XML 文件转换为结构数组,使用... 整数以其正确的类型导入,即 I8/I16/I32/I64/U8/U16/U32/U64 类型的控件被导入为 int8/int16/int32/int64/uint8/ui

    DSP6713-USB

    Uint32 USBTimeOut = 0x0400; BOOL ReadFlag; static Uint8 setupCnt = 0; static BOOL setupDat = False; /* global variables */ Uint8 irqValue; /* interrupt register value */ Uint8 SetupBuff[8]; /* ...

    intmin:返回指定整数类型的最小值

    智力 返回指定整数类型的最小值。...int32 : 有符号的 32 位整数 uint32 : 无符号 32 位整数 如果未提供整数type ,则该函数返回最小的有符号 32 位整数。 intmin ( ) === intmin ( 'int32' ) ;

    单片机内置USB调试固件程序 V1.0 源码

    位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...

    Golang学习笔记(二):类型、变量、常量

    基本类型 1.基本类型列表 代码如下: 类型 长度 说明 bool 1 true/false,默认false, 不能把非0值当做true(不用数字代表true/false) byte 1 uint8 别名 rune 4 int32别名。...int16/uint16 2 -32768 ~

Global site tag (gtag.js) - Google Analytics