diff --git a/dbms/include/DB/VarInt.h b/dbms/include/DB/VarInt.h index 6beeb0d546f..9b363b1e060 100644 --- a/dbms/include/DB/VarInt.h +++ b/dbms/include/DB/VarInt.h @@ -16,6 +16,10 @@ void writeVarUInt(UInt x, std::ostream & ostr); void readVarUInt(UInt & x, std::istream & istr); +/** Получить длину UInt64 в формате VarUInt */ +size_t getLengthOfVarUInt(UInt x); + + /** Записать Int64 в формате переменной длины (base128) */ inline void writeVarInt(Int x, std::ostream & ostr) { @@ -23,11 +27,12 @@ inline void writeVarInt(Int x, std::ostream & ostr) } +// TODO: здесь баг /** Прочитать Int64, записанный в формате переменной длины (base128) */ inline void readVarInt(Int & x, std::istream & istr) { - readVarUInt(reinterpret_cast(x), istr); - x = ((x >> 1) ^ (x << 63)); + readVarUInt(*reinterpret_cast(&x), istr); + x = (x >> 1) ^ (x << 63); } diff --git a/dbms/src/VarInt.cpp b/dbms/src/VarInt.cpp index eadc73fa0c4..71b884203e2 100644 --- a/dbms/src/VarInt.cpp +++ b/dbms/src/VarInt.cpp @@ -137,4 +137,18 @@ void readVarUInt(UInt & x, std::istream & istr) } +size_t getLengthOfVarUInt(UInt x) +{ + return x < (1ULL << 7) ? 1 + : (x < (1ULL << 14) ? 2 + : (x < (1ULL << 21) ? 3 + : (x < (1ULL << 28) ? 4 + : (x < (1ULL << 35) ? 5 + : (x < (1ULL << 42) ? 6 + : (x < (1ULL << 49) ? 7 + : (x < (1ULL << 56) ? 8 + : 9))))))); +} + + }