(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 个人随笔)
参考:https://en.wikipedia.org/wiki/Snappy_(compression)

总述

snappy是google开源的一种压缩方法,用途和lz4比较接近,主要用于高速的压缩与解压。

snappy压缩后的串编码形如:

  1. 原始串长度(7bit有效位压缩整形);
  2. (1-N) 00类型串/01类型串/10类型串/11类型串:这几种类型一个接一个基于需要出现。

和lz不同的点是,snappy首先存了原始串长度,然后才是压缩后的数据内容;
这样方便解压时使用,解压时读取该原始长度,直接按照此分配内存大小长度,用于解压后的数据存放。

00/01/10/11串类型说明

snappy格式压缩串,首先是存了按照7bits存储的长度,然后就是4中类型的表达串了。

00/01/10/11类型串的说明如下:
首个字节的低两bits来标识,是属于其中哪个类型00/01/10/11,然后基于类型来解析后续的字节。
The remaining bytes in the stream are encoded using one of four element types. The element type is encoded in the lower two bits of the first byte (tag byte) of the element.

00-原始字符串literal类型:
低2位存的00;
高6位标识接下来的原始字符串映射长度的值(不存在0长度的,值位0时代表长度1);
其中有几个值有特别的意义:
0b111100=60标识长度存在之后1字节中
0b111101=61标识长度存在之后2字节中
0b111110=62标识长度存下之后3字节中
0b111111=63标识长度存在之后4字节中
例如:0b10000000 代表原始字符串长度为 32+1=33长度;
例如:0b11110000 0b10000000,代表原始字符串长度为128+1=129;
注意:解完长度之后,需要把跟着的解出字节长度字符读到输出中,这个类型才算解完。
00 – Literal – uncompressed data; upper 6 bits are used to store length (len-1) of data. Lengths larger than 60 are stored in a 1-4 byte integer indicated by a 6 bit length of 60 (1 byte) to 63 (4 bytes).

01-从已有数据copy:描述信息带后面1字节
低2位存01;
挨着3位存copy长度,copy长度从4开始;
另外3位和下一个字节一块作为偏移值。
例如:0b00010001 0b10000000代表,0b010=2,长度为2+4=6,0b000 100000000 = 128,偏移值为-128
01 – Copy with length stored as 3 bits and offset stored as 11 bits; one byte after tag byte is used for part of offset;

10-从已有数据copy:描述信息带后面2字节
低2位存10;
其它6位存copy长度,copy长度从4开始;
接下来二个字节存偏移值。
例如:0b10000010 0b00000001 0b00000000 0b100000=32,长度为32+4=36,0x100 = 256,偏移为-256
10 – Copy with length stored as 6 bits of tag byte and offset stored as two-byte integer after the tag byte;

11-从已有数据copy:描述信息带后面3字节
低2位存11;
同10一样,其它6位存copy长度,copy长度从4开始;;
接下来三个字节存偏移值。
例如:0b10000011 0b00000001 0b00000000 0b00000000,长度为32+4=36,0x100000 = 65536,偏移为-65536
11 – Copy with length stored as 6 bits of tag byte and offset stored as four-byte little-endian integer after the tag byte;

解压样例

下面是一个字符串压缩后的解压样例;

原始串:
长度-112
内容

Snappy encoding is not bit-oriented, but byte-oriented (only whole bytes are emitted or consumed from a stream).

压缩后串:
长度-108
内容

0x0000021CB4585340  70 b0 53 6e 61 70 70 79 20 65 6e 63 6f 64 69 6e  p?Snappy encodin
0x0000021CB4585350  67 20 69 73 20 6e 6f 74 20 62 69 74 2d 6f 72 69  g is not bit-ori
0x0000021CB4585360  65 6e 74 65 64 2c 20 62 75 74 20 62 79 74 65 15  ented, but byte.
0x0000021CB4585370  13 e4 20 28 6f 6e 6c 79 20 77 68 6f 6c 65 20 62  .? (only whole b
0x0000021CB4585380  79 74 65 73 20 61 72 65 20 65 6d 69 74 74 65 64  ytes are emitted
0x0000021CB4585390  20 6f 72 20 63 6f 6e 73 75 6d 65 64 20 66 72 6f   or consumed fro
0x0000021CB45853A0  6d 20 61 20 73 74 72 65 61 6d 29 2e 00 00 00 00  m a stream).....

压缩串逐字节解码:

  1. 0x70 - 112,标识源字符串长度112

  2. 0xb0 - 0b10110000 (00)-Literal, 101100=32+8+4=44长度,+1=45长度

  3. 原始串-45字节,copy到输出中
    0x53 6e 61 70 70 79 20 65 6e 63 6f 64 69 6e
    0x67 20 69 73 20 6e 6f 74 20 62 69 74 2d 6f 72 69
    0x65 6e 74 65 64 2c 20 62 75 74 20 62 79 74 65

  4. 0x15-0b00010101 (01)-3bits-len,11bits-offset, len=0b101+4=9(从4开始)
    0x13-0b00010011 offset=0b00010011 = 19,
    offset=19回退到-oriented之前,长度使用9,把对应9字节copy到输出中

  5. e4 - 0b11100100 (00)-literal, 111001=32+16+8+1=57,+1=58长度

  6. 原始串-58字节,copy到输出中
    0x20 28 6f 6e 6c 79 20 77 68 6f 6c 65 20 62
    0x79 74 65 73 20 61 72 65 20 65 6d 69 74 74 65 64
    0x20 6f 72 20 63 6f 6e 73 75 6d 65 64 20 66 72 6f
    0x6d 20 61 20 73 74 72 65 61 6d 29 2e

经过上述操作后,就把压缩后的字符串还原输出了原始字符串;

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 个人随笔)

snappy格式解析相关推荐

  1. 转:YUV RGB 常见视频格式解析

    转: http://www.cnblogs.com/qinjunni/archive/2012/02/23/2364446.html YUV RGB 常见视频格式解析 I420是YUV格式的一种,而Y ...

  2. 【Android RTMP】音频数据采集编码 ( AAC 音频格式解析 | FLV 音频数据标签解析 | AAC 音频数据标签头 | 音频解码配置信息 )

    文章目录 安卓直播推流专栏博客总结 一. AAC 音频格式解析 二. FLV 音频数据标签解析 1. 分析 FLV 格式中的 AAC 音频格式数据 2. AAC 音频特殊配置 3. AAC 音频数据标 ...

  3. java 解析日期格式_日期/时间格式/解析,Java 8样式

    java 解析日期格式 自Java 几乎 开始以来,Java开发人员就通过java.util.Date类(自JDK 1.0起)和java.util.Calendar类(自JDK 1.1起 )来处理日期 ...

  4. 日期/时间格式/解析,Java 8样式

    自Java 几乎 开始以来,Java开发人员就通过java.util.Date类(自JDK 1.0起)和java.util.Calendar类(自JDK 1.1起 )来处理日期和时间. 在这段时间内, ...

  5. 3D模型格式解析(OBJ)

    文章目录 OBJ格式解析 一.OBJ格式 二.vtkOBJReader源码解析 1.主要部分 总结 OBJ格式解析 通过解读vtk源码中对OBJ文件的读取代码,讲解如何获取obj模型的顶点(verte ...

  6. c语言组json包,json格式解析和libjson的用法介绍(关于cjson的使用方法)

    在阅读本文之前,请先阅读下<Rss Reader实例开发之系统设计>一文. Rss Reader实例开发中,进行网络数据交换时主要使用到了两种数据格式:JSON与XML.本文主要介绍JSO ...

  7. mysql binlog c++_MySQL binlog的格式解析

    我搜集到了一些资料,对理解代码比较有帮助. 在头文件中binlog_event.h中,有描述 class Log_event_header class Log_event_footer 参见[Myst ...

  8. JSON格式解析和libjson使用简介-转

    Rss Reader实例开发中,进行网络数据交换时主要使用到了两种数据格式:JSON与XML.本文主要介绍JSON格式的简单概念及JSON在Rss Reader中的应用. JSON格式解析和libjs ...

  9. freemarker导出word文档——WordXML格式解析

    前不久,公司一个项目需要实现导出文档的功能,之前是一个同事在做,做了3个星期,终于完成了,但是在项目上线之后却发现导出的文档有问题,此时,这个同事已经离职,我自然成为接班者,要把导出功能实现,但是我看 ...

  10. png格式解析+java代码生成png图片

    查看更多java体系文档 png文件格式解析 生成一个下图示例的png图片 png图片二进制格式解析 生成png图java代码 package mao.gui.dong.png; import jav ...

最新文章

  1. 《面向模式的软件体系结构2-用于并发和网络化对象模式》读书笔记(3)--- 服务访问和配置模式...
  2. sql 纵向求和_sql列统计求和
  3. qstring如何初始化_QString介绍
  4. spring environment_SpringBoot实战8-Spring基础-应用环境
  5. 软件构造 第一章第二节 软件开发的质量属性
  6. linux添加定时器防抖,linux驱动2.3按键中断-定时器防抖
  7. python3实例车代码_Python编程pygame模块实现移动的小车示例代码
  8. 单片机C语言程序设计实训100例:基于AVR+proteus仿真pdf
  9. C语言题目设圆的半径为2.5,编程该圆的周长和面积。
  10. Office2016软件安装教程
  11. Android中的长度单位详解(dp、sp、px、in、pt、mm)
  12. 《可复制的领导力》脑图
  13. 上个厕所的功夫弄清楚了ES搜索服务器
  14. 交通运输相关机器学习/深度学习相关资源列表,关于交通运输场景的机器学习/深度学习的资源这里都有
  15. Chronometer实现计时器 开始、暂停、停止功能
  16. Voyager的安装及配置文件
  17. Dijkstra,A*,DWA,TEB
  18. 复现腾讯表格识别解析| 鹅厂技术
  19. window修改chrome关闭标签tab快捷键
  20. win10 进不了修复服务器失败,win10系统电脑启动不了的修复方法

热门文章

  1. EMV规范(九)——持卡人验证(CVM)三
  2. 昆明oracle考试点,Oracle认证考试知识点:修改sid的步骤
  3. Exception evaluating SpringEL expression
  4. python selenium 的使用——alibaba询盘
  5. pcf8591简明教程 及 51单片机最大只能读到127问题解决
  6. 天雁计算机TY-82MS-4说明书,怎样用天雁TY-82MS-4计算器做一次和二次函数,跪谢!...
  7. java毕业设计校园服装租赁系统mybatis+源码+调试部署+系统+数据库+lw
  8. 计算机组成原理(笔记)
  9. 智能头盔 Livall携全球首款智能骑行头盔亮相CES
  10. 初秋进补 粥汤大对决