最近在看手机用的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;
 }