00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "varint.h"
00019
00020 char* Varint::Encode32(char* ptr, uint32 v) {
00021 static const int B = 128;
00022 if (v < (1<<7)) {
00023 *(ptr++) = v;
00024 } else if (v < (1<<14)) {
00025 *(ptr++) = v | B;
00026 *(ptr++) = v>>7;
00027 } else if (v < (1<<21)) {
00028 *(ptr++) = v | B;
00029 *(ptr++) = (v>>7) | B;
00030 *(ptr++) = v>>14;
00031 } else if (v < (1<<28)) {
00032 *(ptr++) = v | B;
00033 *(ptr++) = (v>>7) | B;
00034 *(ptr++) = (v>>14) | B;
00035 *(ptr++) = v>>21;
00036 } else {
00037 *(ptr++) = v | B;
00038 *(ptr++) = (v>>7) | B;
00039 *(ptr++) = (v>>14) | B;
00040 *(ptr++) = (v>>21) | B;
00041 *(ptr++) = v>>28;
00042 }
00043 return ptr;
00044 }
00045
00046 char* Varint::Encode64(char* ptr, uint64 v) {
00047 static const int B = 128;
00048 do {
00049
00050 int bits = (((int) v) & 127);
00051 v >>= 7;
00052 *(ptr++) = static_cast<unsigned char>(bits + ((v != 0) ? B : 0));
00053 } while (v != 0);
00054 return ptr;
00055 }