Simple16 字符压缩
#define S16_NUMSIZE 16
#define S16_BITSSIZE 28
#define Simple16_Mask 0x7FFFFFFF extern int S16_NUM[];
extern int S16_NUMOFF[];
extern int S16_BITS[16][28]; class Simple16
{
public:
static int* Compress(int * pnIn, int nLen, int * pnLenOut); static void Decompress(int * pnIn, int nLen, sgi::vector<unsigned int>& outVec); static int* Decompress(int * pnIn, int nLen, int * pnLenOut); private:
static int S16CompresShort(int out[], int outOffset, short in[], int inOffset, int n); static int S16Compress(int out[], int outOffset, int in[], int inOffset, int n); static int ReadBitsForS16(int in[], int inIntOffset, int inWithIntOffset, int bits); static int S16Decompress(int out[], int outOffset, int in[], int inOffset, int n); static int S16Decompress(sgi::vector<unsigned int>& outVec, int outOffset, int in[], int inOffset, int n); static int S16DecompressShort(short out[], int outOffset, int in[], int inOffset, int n); static int* CompressShort(short * pnIn, int nLen, int * pnLenOut); static short* DecompressShort(int * pnIn, int nLen, int * pnLenOut);
};
int S16_NUM[] = { 28, 21, 21, 21, 14, 9, 8, 7, 6, 6, 5, 5, 4, 3, 2, 1 };
int S16_NUMOFF[] = { 15, 14, 13, 12, 10, 8, 7, 6, 5, 4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 };
int S16_BITS[16][28] = { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
{ 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0 },
{ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 4, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 3, 4, 4, 4, 4, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 5, 5, 5, 5, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 4, 4, 5, 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 6, 6, 6, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 5, 5, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 10, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
int Simple16::S16CompresShort(int out[], int outOffset, short in[], int inOffset, int n)
{
int numIdx = 0, j = 0, num = 0, bits = 0;
for (numIdx = 0; (numIdx < S16_NUMSIZE); numIdx++)
{
out[outOffset] = numIdx << S16_BITSSIZE;
num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n;
for (j = 0, bits = 0; (j < num) && in[inOffset + j] < (1 << S16_BITS[numIdx][j]);)
{
out[outOffset] |= (in[inOffset + j] << bits);
bits += S16_BITS[numIdx][j];
j++;
}
if (j == num)
{
return num;
}
}
return -1;
}
/**
* Compress an integer array using Simple16
*
* @param out the compressed output
* @param outOffset the offset of the output in the number of integers
* @param in the integer input array
* @param inOffset the offset of the input in the number of integers
* @param n the number of elements to be compressed
* @return the number of compressed integers
*/
int Simple16::S16Compress(int out[], int outOffset, int in[], int inOffset, int n )
{
int numIdx = 0, j = 0, num = 0, bits = 0;
int mi = 1;
unsigned int id = 0u;
for (j = 0, bits = 0; j < n; j++)
{
id = in[inOffset + j];
mi = 1;
if (id == 0)
{
bits++;
}
else
{
if ((id >> 16) == 0) { mi = mi + 16; id = id << 16; }
if ((id >> 24) == 0) { mi = mi + 8; id = id << 8; }
if ((id >> 28) == 0) { mi = mi + 4; id = id << 4; }
if ((id >> 30) == 0) { mi = mi + 2; id = id << 2; }
bits += (32 - mi + (id >> 31));
}
if (bits > S16_BITSSIZE)
{
break;
}
}
numIdx = S16_NUMOFF[j - 1];
for (; (numIdx < S16_NUMSIZE); numIdx++)
{
out[outOffset] = numIdx << S16_BITSSIZE;
num = (S16_NUM[numIdx] < n) ? S16_NUM[numIdx] : n;
for (j = 0, bits = 0; (j < num) && in[inOffset + j] < (1 << S16_BITS[numIdx][j]);)
{
out[outOffset] |= (in[inOffset + j] << bits);
bits += S16_BITS[numIdx][j];
j++;
}
if (j == num)
{
return num;
}
}
return -1;
}
/**
* Read a certain number of bits of a integer on the input array
* @param in the input array
* @param inIntOffset the start offset in ints in the input array
* @param inWithIntOffset the start offset within a int in the input array
* @param bits the number of bits to be read
* @return the bits bits of the input
*/
int Simple16::ReadBitsForS16(int in[], int inIntOffset, int inWithIntOffset, int bits) {
// 正整数不需要考虑 补0 的问题
int nVal = (in[inIntOffset] >> inWithIntOffset);
if (nVal < 0)
nVal &= 0x7FFFFFFF;
return nVal & ((0xffffffff >> (32 - bits)) & 0x7FFFFFFF);
}
/**
* Decompress an integer array using Simple16
*
* @param out the decompressed output
* @param outOffset the offset of the output in the number of integers
* @param in the compressed input array
* @param inOffset the offset of the input in the number of integers
* @param n the number of elements to be compressed
* @return the number of processed integers
*/
int Simple16::S16Decompress(int out[], int outOffset, int in[], int inOffset, int n)
{
int numIdx, j = 0, bits = 0;
int num;
numIdx = (in[inOffset] >> S16_BITSSIZE) & (Simple16_Mask >> (S16_BITSSIZE - 1));
num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n;
for (j = 0, bits = 0; j < num; j++)
{
out[outOffset + j] = ReadBitsForS16(in, inOffset, bits, S16_BITS[numIdx][j]);
bits += S16_BITS[numIdx][j];
}
return num;
}
int Simple16::S16Decompress(sgi::vector<unsigned int>& outVec, int outOffset, int in[], int inOffset, int n)
{
int numIdx, j = 0, bits = 0;
int num;
numIdx = (in[inOffset] >> S16_BITSSIZE) & (Simple16_Mask >> (S16_BITSSIZE - 1));
num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n;
for (j = 0, bits = 0; j < num; j++)
{
outVec[outOffset + j] = ReadBitsForS16(in, inOffset, bits, S16_BITS[numIdx][j]);
bits += S16_BITS[numIdx][j];
}
return num;
}
int Simple16::S16DecompressShort(short out[], int outOffset, int in[], int inOffset, int n)
{
int numIdx, j = 0, bits = 0;
int num;
numIdx = (in[inOffset] >> S16_BITSSIZE) & (Simple16_Mask >> (S16_BITSSIZE - 1));
num = S16_NUM[numIdx] < n ? S16_NUM[numIdx] : n;
for (j = 0, bits = 0; j < num; j++)
{
out[outOffset + j] = ReadBitsForS16(in, inOffset, bits, S16_BITS[numIdx][j]);
bits += S16_BITS[numIdx][j];
}
return num;
}
int* Simple16::Decompress(int * pnIn, int nLen, int * pnLenOut)
{
int * pnRes = NULL;
*pnLenOut = 0;
if (NULL == pnIn || nLen <= 0)
return pnRes;
{
int nNum = 0;
int nNumLeft = nLen;
int nOutOffset = 0;
int nInOffset = 0;
int nLenTemp = sizeof(int) * nLen;
//int * pnResTemp = NULL;
pnRes = (int*)malloc(nLenTemp);
//memset(pnRes, 0, nLenTemp);
for (nNumLeft = nLen; nNumLeft > 0; nNumLeft -= nNum)
{
nNum = S16Decompress(pnRes, nOutOffset, pnIn, nInOffset, nNumLeft);
nOutOffset += nNum;
nInOffset++;
}
*pnLenOut = nInOffset;
}
return pnRes;
}
void Simple16::Decompress(int * pnIn, int nLen, sgi::vector<unsigned int>& outVec)
{
if (NULL == pnIn || nLen <= 0)
return;
{
int nNum = 0;
int nNumLeft = nLen;
int nInOffset = 0;
int nOutOffset = 0;
//outVec.clear();
outVec.resize(nLen);
for (nNumLeft = nLen; nNumLeft > 0; nNumLeft -= nNum)
{
nNum = S16Decompress(outVec, nOutOffset, pnIn, nInOffset, nNumLeft);
nOutOffset += nNum;
nInOffset++;
}
}
}
int* Simple16::Compress(int * pnIn, int nLen, int * pnLenOut)
{
int * pnRes = NULL;
*pnLenOut = 0;
if (NULL == pnIn || nLen <= 0)
return pnRes;
{
int nNum = 0;
int nNumLeft = nLen;
int nOutOffset = 0;
int nInOffset = 0;
int nLenTemp = sizeof(int)* nLen;
// int * pnResTemp = NULL;
pnRes = (int*)malloc(nLenTemp);
//memset(pnRes, 0, nLenTemp);
for (nNumLeft = nLen; nNumLeft > 0; nNumLeft -= nNum)
{
nNum = S16Compress(pnRes, nOutOffset, pnIn, nInOffset, nNumLeft);
nOutOffset++;
nInOffset += nNum;
}
*pnLenOut = nOutOffset;
// nLenTemp = sizeof(int)* nOutOffset;
// pnResTemp = (int*)malloc(nLenTemp);
// memset(pnResTemp, 0, nLenTemp);
//
// memcpy(pnResTemp, pnRes, nLenTemp);
// free(pnRes);
// pnRes = pnResTemp;
return pnRes;
}
return pnRes;
}
int* Simple16::CompressShort(short * pnIn, int nLen, int * pnLenOut)
{
int * pnRes = NULL;
*pnLenOut = 0;
if (NULL == pnIn || nLen <= 0)
return pnRes;
{
int nNum = 0;
int nNumLeft = nLen;
int nOutOffset = 0;
int nInOffset = 0;
int nLenTemp = sizeof(int)* nLen;
int * pnResTemp = NULL;
pnRes = (int*)malloc(nLenTemp);
memset(pnRes, 0, nLenTemp);
for (nNumLeft = nLen; nNumLeft > 0; nNumLeft -= nNum)
{
nNum = S16CompresShort(pnRes, nOutOffset, pnIn, nInOffset, nNumLeft);
nOutOffset++;
nInOffset += nNum;
}
*pnLenOut = nOutOffset;
nLenTemp = sizeof(int)* nOutOffset;
pnResTemp = (int*)malloc(nLenTemp);
memset(pnResTemp, 0, nLenTemp);
memcpy(pnResTemp, pnRes, nLenTemp);
free(pnRes);
pnRes = pnResTemp;
}
return pnRes;
}
short* Simple16::DecompressShort(int * pnIn, int nLen, int * pnLenOut)
{
short * pnRes = NULL;
*pnLenOut = 0;
if (NULL == pnIn || nLen <= 0)
return pnRes;
{
int nNum = 0;
int nNumLeft = nLen;
int nOutOffset = 0;
int nInOffset = 0;
int nLenTemp = sizeof(short)* nLen;
//int * pnResTemp = NULL;
pnRes = (short*)malloc(nLenTemp);
memset(pnRes, 0, nLenTemp);
for (nNumLeft = nLen; nNumLeft > 0; nNumLeft -= nNum)
//while ( nInOffset < nLen)
{
nNum = S16DecompressShort(pnRes, nOutOffset, pnIn, nInOffset, nNumLeft);
nOutOffset += nNum;
nInOffset++;
}
*pnLenOut = nInOffset;
//nLenTemp = sizeof(short)* nOutOffset;
//pnResTemp = MM_MALLOC(nLenTemp);
//MEMSET(pnResTemp, 0, nLenTemp);
//MEMCPY(pnResTemp, pnRes, nLenTemp);
//MM_FREEIF(pnRes);
//pnRes = pnResTemp;
}
return pnRes;
}
Simple16 字符压缩的更多相关文章
- 利用ICSharpCode.SharpZipLib.Zip进行文件压缩
官网http://www.icsharpcode.net/ 支持文件和字符压缩. 创建全新的压缩包 第一步,创建压缩包 using ICSharpCode.SharpZipLib.Zip; ZipOu ...
- RGB图像数据字符叠加,图像压缩(ijl库),YUV转RGB
jackyhwei 发布于 2010-01-01 12:02 点击:3218次 来自:CSDN.NET 一些非常有用的图像格式转换及使用的源代码,包括RGB图像数据字符叠加,图像压缩(ijl库),Y ...
- 重温CLR(十) 字符、字符串和文本处理
本章将介绍.net中处理字符和字符串的机制 字符 在.NET Framewole中,字符总是表示成16位Unicode代码值,这简化了国际化应用程序的开发. 每个字符都表示成System.Char结构 ...
- zip压缩详细分析
该文章转自:http://www.cnblogs.com/esingchan/p/3958962.html (文章写得很详细,让我对zip压缩有了了解,感谢博主,贴在这是为了防止忘了有这么好的文章,侵 ...
- C#之字符编码
在 Windows Vista 及之后的版本中,每个Unicode字符都使用UTF-16编码,UTF的全称是 Unicode Transformation Format(Unicode 转换格式).U ...
- 3.20 tr:替换或删除字符
tr命令 从标准输入中替换.缩减或删除字符,并将结果写到标准输出. tr [option] [SET1] [SET2] tr [选项] [字符1] [字符2] -d 删除字符 -s ...
- ZIP压缩算法详细分析及解压实例解释
最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据 ...
- 2015 ACM Syrian Collegiate Programming Contest
A. My Friend of Misery 计算出答案的上下界即可. 时间复杂度$O(n)$. #include<bits/stdc++.h> using namespace std; ...
- 【数据压缩】LZ77算法原理及实现
1. 引言 LZ77算法是采用字典做数据压缩的算法,由以色列的两位大神Jacob Ziv与Abraham Lempel在1977年发表的论文<A Universal Algorithm for ...
随机推荐
- spring-boot -配置文件值注入
/** * 将配置文件中配置的每一个属性的值,映射到这个组件中 * @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定: 默认在 ...
- Python基础之流程控制if判断
目录 1. 语法 1.1 if语句 1.2 if...else 1.3 if...elif...else 2. if的嵌套 3. if...else语句的练习 1. 语法 1.1 if语句 最简单的i ...
- Excel-转换单元格格式的函数或“方法”汇总
14.转换单元格格式的函数或"方法"汇总 =value(单元格) #转换为数值 =A1&"" #转换A1为文本 = ...
- spring整合mybatis — 更新完毕
1.准备工作 -- 导入依赖 <dependency> <groupId>org.springframework</groupId> <artifactId& ...
- cvc-complex-type.2.3: Element 'servlet' cannot have character [children], because the type's content
错误原因:粘贴代码 <servlet> <servlet-name>barServlet</servlet-name> <servlet-class>S ...
- 在windows 10家庭版上安装docker的步骤
本人之前写Redis书和Spring Cloud Alibaba书时,发现一些分布式组件更适合安装在linux环境,而在搭建Redis等集群时,更需要linux环境. 本人日常练习代码和写书所用的机器 ...
- Netty之Channel*
Netty之Channel* 本文内容主要参考**<<Netty In Action>> ** 和Netty的文档和源码,偏笔记向. 先简略了解一下ChannelPipelin ...
- 如何删除苹果电脑垃圾文件-7个高级技巧释放大量苹果Mac
硬盘空间用尽是一件很让人头疼的事情,尤其是MacBook Air等设备上的固态硬盘可用的储存空间很少.下面[微IT]为大家介绍7个高级技巧来释放大量的硬盘空间,当然这些高级技巧更改了系统功能和文件,必 ...
- git 的基本流程
有个本地文件 打开 新建一个 打开git $ git push origin master 这里是上传文件. (你每次上传的时候,都要先提交到本地的仓库...然后再上传) github上就有了 如何 ...
- display:inline-block,block,inline元素的区别
1.display:block将元素显示为块级元素,从而可以更好地操控元素的宽高,以及内外边距,每一个块级元素都是从新的一行开始.2.display : inline将元素显示为行内元素,高度,行高以 ...