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 ...
随机推荐
- C++ and OO Num. Comp. Sci. Eng. - Part 4.
命名空间与文件(Namespaces and Files) 在 C++ 中,命名空间为包含相关声明与定义的逻辑单元. 将一个大程序分割为不同部分并且将其储存在不同的文件中可以实现模块化编程. 未命名的 ...
- EXCEL-排名前三名显示小红旗,后三名显示小黑旗
总结(用的WPS):第一步:用=IF(RANK(数值,引用范围) <=3,"小红旗",IF(RANK(数值,引用,1) <=3,"小黑旗",&quo ...
- EXCEL如何用公式提取一列中的唯一值和不重复值
说明:思路用的很新奇,也对COUNTIF有了更深一步的了解,但是,对于百行数据运算速度特别低,不适合数据多的使用 当面对一堆数据,我们要提取一列的唯一值的时候,如果单纯用人为一个个判断,显然是不科学的 ...
- ICCV2021 | TOOD:任务对齐的单阶段目标检测
前言 单阶段目标检测通常通过优化目标分类和定位两个子任务来实现,使用具有两个平行分支的头部,这可能会导致两个任务之间的预测出现一定程度的空间错位.本文提出了一种任务对齐的一阶段目标检测(TOOD) ...
- 面向多场景而设计的 Erda Pipeline
作者|林俊(万念) 来源|尔达 Erda 公众号 Erda Pipeline 是端点自研.用 Go 编写的一款企业级流水线服务.截至目前,已经为众多行业头部客户提供交付和稳定的服务. 为什么我们坚持自 ...
- 大数据学习day20-----spark03-----RDD编程实战案例(1 计算订单分类成交金额,2 将订单信息关联分类信息,并将这些数据存入Hbase中,3 使用Spark读取日志文件,根据Ip地址,查询地址对应的位置信息
1 RDD编程实战案例一 数据样例 字段说明: 其中cid中1代表手机,2代表家具,3代表服装 1.1 计算订单分类成交金额 需求:在给定的订单数据,根据订单的分类ID进行聚合,然后管理订单分类名称, ...
- 【swift】用Xib实现自定义警告框(Alert)(安卓叫法:Dialog对话框)
在写这篇博客前,先感谢两篇博客 [如何自定义的思路]:https://www.cnblogs.com/apprendre-10-28/p/10507794.html [如何绑定Xib并且使用]:htt ...
- APK 反编译以及遇到的问题
APK反编译: https://www.cnblogs.com/geeksongs/p/10864200.html 遇到的问题 https://www.jianshu.com/p/55bf5f688e ...
- Servlet(3):Cookie和Session
一. Cookie Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器.当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去.这样,web资源处理的 ...
- 【Linux】【Shell】【Basic】Bash
命令历史:shell进程会在其会话中保存此前用户提交执行过的命令: ------------------------------------------------------------------ ...