#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 字符压缩的更多相关文章

  1. 利用ICSharpCode.SharpZipLib.Zip进行文件压缩

    官网http://www.icsharpcode.net/ 支持文件和字符压缩. 创建全新的压缩包 第一步,创建压缩包 using ICSharpCode.SharpZipLib.Zip; ZipOu ...

  2. RGB图像数据字符叠加,图像压缩(ijl库),YUV转RGB

    jackyhwei 发布于 2010-01-01 12:02 点击:3218次  来自:CSDN.NET 一些非常有用的图像格式转换及使用的源代码,包括RGB图像数据字符叠加,图像压缩(ijl库),Y ...

  3. 重温CLR(十) 字符、字符串和文本处理

    本章将介绍.net中处理字符和字符串的机制 字符 在.NET Framewole中,字符总是表示成16位Unicode代码值,这简化了国际化应用程序的开发. 每个字符都表示成System.Char结构 ...

  4. zip压缩详细分析

    该文章转自:http://www.cnblogs.com/esingchan/p/3958962.html (文章写得很详细,让我对zip压缩有了了解,感谢博主,贴在这是为了防止忘了有这么好的文章,侵 ...

  5. C#之字符编码

    在 Windows Vista 及之后的版本中,每个Unicode字符都使用UTF-16编码,UTF的全称是 Unicode Transformation Format(Unicode 转换格式).U ...

  6. 3.20 tr:替换或删除字符

    tr命令 从标准输入中替换.缩减或删除字符,并将结果写到标准输出. tr [option] [SET1]  [SET2] tr [选项]   [字符1]  [字符2]   -d    删除字符 -s  ...

  7. ZIP压缩算法详细分析及解压实例解释

    最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据 ...

  8. 2015 ACM Syrian Collegiate Programming Contest

    A. My Friend of Misery 计算出答案的上下界即可. 时间复杂度$O(n)$. #include<bits/stdc++.h> using namespace std; ...

  9. 【数据压缩】LZ77算法原理及实现

    1. 引言 LZ77算法是采用字典做数据压缩的算法,由以色列的两位大神Jacob Ziv与Abraham Lempel在1977年发表的论文<A Universal Algorithm for ...

随机推荐

  1. R 语言实战-Part 5-2笔记

    R 语言实战(第二版) part 5-2 技能拓展 ----------第21章创建包-------------------------- #包是一套函数.文档和数据的合集,以一种标准的格式保存 #1 ...

  2. Yii自定义全局异常,接管系统异常

    Yii自定义全局异常,接管系统异常 一般自己的框架都会使用一些自己封装的全局异常,那么在系统发生异常突发情况时候,即可自主的做一些异常机制处理,例如发送短信.发送邮件通知系统维护人员或者以更加友好的方 ...

  3. zabbix监控php状态

    环境介绍: php /usr/loca/php nignx /usr/loca/nginx  配置文件都是放在extra中 修改php-fpm的配置文件启动状态页面 pm.status_path = ...

  4. javaWeb - 3 — JSP (技术已淘汰)— 更新完毕

    1.jsp 在servlet中说过java中前端到后台有两条路线嘛 后台 <------ ajax.json <--------- 前端 后台 <------ jsp( EL.JST ...

  5. 基于 Golang 构建高可扩展的云原生 PaaS(附 PPT 下载)

    作者|刘浩杨 来源|尔达 Erda 公众号 ​ 本文整理自刘浩杨在 GopherChina 2021 北京站主会场的演讲,微信添加:Erda202106,联系小助手即可获取讲师 PPT. 前言 当今时 ...

  6. The Ultimate Guide to Buying A New Camera

    [photographyconcentrate] 六级/考研单词: embark, thrill, excite, intimidate, accessory, comprehensive, timi ...

  7. 逻辑学与Prolog学习笔记

    int a = 3 + 5; 很自然.如果Matrix a, b要加呢?没有运算符重载,a + b是不行的,只能add(a, b). int a = add(3, 5)也行.如果函数名可以用+呢?+( ...

  8. 商业爬虫学习笔记day5

    一. 发送post请求 import requests url = "" # 发送post请求 data = { } response = requests.post(url, d ...

  9. Linux学习 - 权限管理命令

    一.chmod(change the permissions mode of a file) 1 功能 改变文件或目录权限 root 与 所有者 可进行此操作 2 语法 chmod  [(ugoa) ...

  10. RHEL 6.5 安装ORACEL11gR2

    1.关闭selinux,用vi /etc/selinux/config selinux=disabled 2.使用yum安装rpm yum -y install compat-db compat-db ...