一种节省整型数存储空间的方法
最近在看手机用的MMS文件(手机彩信的格式)的数据结构
觉得这种节省整型数存储空间的方法很好
一个整型数据一般要4个字节,但是有时候存储空间很紧张,但是数字的取值范围却很大
比如一个数的取值范围从0 - 2^64 都有可能,但是有不能用8个字节来存放,太浪费。
手机上是这样解决的
用一系列连续的字节来表示整数,字节的最高位作为标志位,高位为1表示后面还有一个字节
高位为0表示这是最后一个字节,其余的7位表示整数的值,字节序是高位在前低位在后,和x86的字节序相反
WAP文档里称这种整数为UintVar
这样的话:
<=0x7F 1 Byte
<=0x3FFF 2 Bytes
<=0x1FFFFF 3 Bytes
....
理论上讲这样可以存储无限大的整数
下面的代码可以把一个int型整数变成UIntVar的字节
返回值是转换后字节的个数,如果lpBytes参数给NULL,则返回需要的字节数
int encodeUintvar(int nData, BYTE * lpBytes)
{
BYTE buf[8] = {0, 0, 0, 0, 0, 0, 0, 0};
int n = 0;
while(nData >= 128)
{
BYTE b = static_cast
nData = nData >> 7;
buf[n++] = b;
}
buf[n++] = static_cast
if(lpBytes == NULL)
{
return n;
}
for(int i = 0; i < n; ++i)
{
lpBytes[i] = buf[n - i - 1] | 0x80;
}
lpBytes[n - 1] &= 0x7F;
return n;
}
posted on 2004-08-27 14:19:00 by yaodong 评论(10) 阅读(4114)