#include<iostream>
#include<stdio.h>
#include<stack>
using namespace std;
#define BYTE unsigned char
#define STREAM 100
#define ARRAY 10
void PrintInBinary(BYTE* bytestream,int length)
{
for(int i=0;i<length;i++)
{
BYTE tmp = bytestream[i];
for(int j=7;j>=0;j--)
{
int n = (((int)tmp)>>j) &0x1;
printf("%d",n);
}
printf(" ");
}
printf("\n");
}
int VBEncodeNumber(int n,int start,BYTE* bytestream)
{
stack<BYTE> bucket;
while(true)
{
if(n<128)break;
bytestream[start++] = n%128;
n = n / 128;
}
bytestream[start++] = (0x80|n);
return start;
}
BYTE* VBEncode(int numbers[],int length,int &streamLength)
{
BYTE* bytestream = new BYTE[STREAM ];
for(int i=0;i<length;i++)
streamLength = VBEncodeNumber(numbers[i],streamLength,bytestream);
PrintInBinary(bytestream,streamLength);
return bytestream;
}
int* VBDecode(BYTE* bytestream,int &streamLength,int &arrayLength)
{
int* numbers = new int[ARRAY];
numbers[0] = 0;
arrayLength=0;
for(int i=0,n=0,j=0;i<streamLength;i++)
{
if(bytestream[i] < 128)
n += bytestream[i]*pow(128,j++);
else
{
n += (bytestream[i]-128)*pow(128,j);
numbers[arrayLength] = n ;
n = 0;j=0;arrayLength++;
}
}
for(int i=0;i<arrayLength;i++)
cout << numbers[i]<<" ";
cout << endl;
return numbers;
}
int main()
{
int a[7] = {0,1,2,127,128,130,16385};
int streamLength = 0,arrayLength = 0;
VBDecode(VBEncode(a,7,streamLength),streamLength,arrayLength);
system("pause");
return 0;
}