摘要:最近在看手机用的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 & 0x7F); nData = nData >> 7; buf[n++] = b; } buf[n++] = static_cast(nData);
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; }...[
阅读全文]