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 ...
随机推荐
- R 语言实战-Part 5-2笔记
R 语言实战(第二版) part 5-2 技能拓展 ----------第21章创建包-------------------------- #包是一套函数.文档和数据的合集,以一种标准的格式保存 #1 ...
- Yii自定义全局异常,接管系统异常
Yii自定义全局异常,接管系统异常 一般自己的框架都会使用一些自己封装的全局异常,那么在系统发生异常突发情况时候,即可自主的做一些异常机制处理,例如发送短信.发送邮件通知系统维护人员或者以更加友好的方 ...
- zabbix监控php状态
环境介绍: php /usr/loca/php nignx /usr/loca/nginx 配置文件都是放在extra中 修改php-fpm的配置文件启动状态页面 pm.status_path = ...
- javaWeb - 3 — JSP (技术已淘汰)— 更新完毕
1.jsp 在servlet中说过java中前端到后台有两条路线嘛 后台 <------ ajax.json <--------- 前端 后台 <------ jsp( EL.JST ...
- 基于 Golang 构建高可扩展的云原生 PaaS(附 PPT 下载)
作者|刘浩杨 来源|尔达 Erda 公众号 本文整理自刘浩杨在 GopherChina 2021 北京站主会场的演讲,微信添加:Erda202106,联系小助手即可获取讲师 PPT. 前言 当今时 ...
- The Ultimate Guide to Buying A New Camera
[photographyconcentrate] 六级/考研单词: embark, thrill, excite, intimidate, accessory, comprehensive, timi ...
- 逻辑学与Prolog学习笔记
int a = 3 + 5; 很自然.如果Matrix a, b要加呢?没有运算符重载,a + b是不行的,只能add(a, b). int a = add(3, 5)也行.如果函数名可以用+呢?+( ...
- 商业爬虫学习笔记day5
一. 发送post请求 import requests url = "" # 发送post请求 data = { } response = requests.post(url, d ...
- Linux学习 - 权限管理命令
一.chmod(change the permissions mode of a file) 1 功能 改变文件或目录权限 root 与 所有者 可进行此操作 2 语法 chmod [(ugoa) ...
- RHEL 6.5 安装ORACEL11gR2
1.关闭selinux,用vi /etc/selinux/config selinux=disabled 2.使用yum安装rpm yum -y install compat-db compat-db ...