提交 e4b2657e 编写于 作者: A Alexey Milovidov

dbms: fixed VarUInt for numbers with highest significant bit set [#CONV-2944].

上级 a8cf5508
......@@ -17,31 +17,31 @@ void writeVarUInt(UInt64 x, std::ostream & ostr)
{
char buf[9];
buf[0] = static_cast<Poco::UInt8>(x | 0x80);
buf[0] = static_cast<UInt8>(x | 0x80);
if (x >= (1ULL << 7))
{
buf[1] = static_cast<Poco::UInt8>((x >> 7) | 0x80);
buf[1] = static_cast<UInt8>((x >> 7) | 0x80);
if (x >= (1ULL << 14))
{
buf[2] = static_cast<Poco::UInt8>((x >> 14) | 0x80);
buf[2] = static_cast<UInt8>((x >> 14) | 0x80);
if (x >= (1ULL << 21))
{
buf[3] = static_cast<Poco::UInt8>((x >> 21) | 0x80);
buf[3] = static_cast<UInt8>((x >> 21) | 0x80);
if (x >= (1ULL << 28))
{
buf[4] = static_cast<Poco::UInt8>((x >> 28) | 0x80);
buf[4] = static_cast<UInt8>((x >> 28) | 0x80);
if (x >= (1ULL << 35))
{
buf[5] = static_cast<Poco::UInt8>((x >> 35) | 0x80);
buf[5] = static_cast<UInt8>((x >> 35) | 0x80);
if (x >= (1ULL << 42))
{
buf[6] = static_cast<Poco::UInt8>((x >> 42) | 0x80);
buf[6] = static_cast<UInt8>((x >> 42) | 0x80);
if (x >= (1ULL << 49))
{
buf[7] = static_cast<Poco::UInt8>((x >> 49) | 0x80);
buf[7] = static_cast<UInt8>((x >> 49) | 0x80);
if (x >= (1ULL << 56))
{
buf[8] = static_cast<Poco::UInt8>((x >> 56) | 0x80);
buf[8] = static_cast<UInt8>(x >> 56);
ostr.write(buf, 9);
}
else
......@@ -99,39 +99,39 @@ void readVarUInt(UInt64 & x, std::istream & istr)
int byte;
byte = istr.get();
x = static_cast<Poco::UInt64>(byte) & 0x7F;
x = static_cast<UInt64>(byte) & 0x7F;
if (byte & 0x80)
{
byte = istr.get();
x |= (static_cast<Poco::UInt64>(byte) & 0x7F) << 7;
x |= (static_cast<UInt64>(byte) & 0x7F) << 7;
if (byte & 0x80)
{
byte = istr.get();
x |= (static_cast<Poco::UInt64>(byte) & 0x7F) << 14;
x |= (static_cast<UInt64>(byte) & 0x7F) << 14;
if (byte & 0x80)
{
byte = istr.get();
x |= (static_cast<Poco::UInt64>(byte) & 0x7F) << 21;
x |= (static_cast<UInt64>(byte) & 0x7F) << 21;
if (byte & 0x80)
{
byte = istr.get();
x |= (static_cast<Poco::UInt64>(byte) & 0x7F) << 28;
x |= (static_cast<UInt64>(byte) & 0x7F) << 28;
if (byte & 0x80)
{
byte = istr.get();
x |= (static_cast<Poco::UInt64>(byte) & 0x7F) << 35;
x |= (static_cast<UInt64>(byte) & 0x7F) << 35;
if (byte & 0x80)
{
byte = istr.get();
x |= (static_cast<Poco::UInt64>(byte) & 0x7F) << 42;
x |= (static_cast<UInt64>(byte) & 0x7F) << 42;
if (byte & 0x80)
{
byte = istr.get();
x |= (static_cast<Poco::UInt64>(byte) & 0x7F) << 49;
x |= (static_cast<UInt64>(byte) & 0x7F) << 49;
if (byte & 0x80)
{
byte = istr.get();
x |= (static_cast<Poco::UInt64>(byte) & 0x7F) << 56;
x |= static_cast<UInt64>(byte) << 56;
}
}
}
......@@ -147,31 +147,31 @@ void writeVarUInt(UInt64 x, WriteBuffer & ostr)
{
char buf[9];
buf[0] = static_cast<Poco::UInt8>(x | 0x80);
buf[0] = static_cast<UInt8>(x | 0x80);
if (x >= (1ULL << 7))
{
buf[1] = static_cast<Poco::UInt8>((x >> 7) | 0x80);
buf[1] = static_cast<UInt8>((x >> 7) | 0x80);
if (x >= (1ULL << 14))
{
buf[2] = static_cast<Poco::UInt8>((x >> 14) | 0x80);
buf[2] = static_cast<UInt8>((x >> 14) | 0x80);
if (x >= (1ULL << 21))
{
buf[3] = static_cast<Poco::UInt8>((x >> 21) | 0x80);
buf[3] = static_cast<UInt8>((x >> 21) | 0x80);
if (x >= (1ULL << 28))
{
buf[4] = static_cast<Poco::UInt8>((x >> 28) | 0x80);
buf[4] = static_cast<UInt8>((x >> 28) | 0x80);
if (x >= (1ULL << 35))
{
buf[5] = static_cast<Poco::UInt8>((x >> 35) | 0x80);
buf[5] = static_cast<UInt8>((x >> 35) | 0x80);
if (x >= (1ULL << 42))
{
buf[6] = static_cast<Poco::UInt8>((x >> 42) | 0x80);
buf[6] = static_cast<UInt8>((x >> 42) | 0x80);
if (x >= (1ULL << 49))
{
buf[7] = static_cast<Poco::UInt8>((x >> 49) | 0x80);
buf[7] = static_cast<UInt8>((x >> 49) | 0x80);
if (x >= (1ULL << 56))
{
buf[8] = static_cast<Poco::UInt8>((x >> 56) | 0x80);
buf[8] = static_cast<UInt8>(x >> 56);
ostr.write(buf, 9);
}
else
......@@ -229,39 +229,39 @@ void readVarUInt(UInt64 & x, ReadBuffer & istr)
char byte;
readChar(byte, istr);
x = static_cast<Poco::UInt64>(byte) & 0x7F;
x = static_cast<UInt64>(byte) & 0x7F;
if (byte & 0x80)
{
readChar(byte, istr);
x |= (static_cast<Poco::UInt64>(byte) & 0x7F) << 7;
x |= (static_cast<UInt64>(byte) & 0x7F) << 7;
if (byte & 0x80)
{
readChar(byte, istr);
x |= (static_cast<Poco::UInt64>(byte) & 0x7F) << 14;
x |= (static_cast<UInt64>(byte) & 0x7F) << 14;
if (byte & 0x80)
{
readChar(byte, istr);
x |= (static_cast<Poco::UInt64>(byte) & 0x7F) << 21;
x |= (static_cast<UInt64>(byte) & 0x7F) << 21;
if (byte & 0x80)
{
readChar(byte, istr);
x |= (static_cast<Poco::UInt64>(byte) & 0x7F) << 28;
x |= (static_cast<UInt64>(byte) & 0x7F) << 28;
if (byte & 0x80)
{
readChar(byte, istr);
x |= (static_cast<Poco::UInt64>(byte) & 0x7F) << 35;
x |= (static_cast<UInt64>(byte) & 0x7F) << 35;
if (byte & 0x80)
{
readChar(byte, istr);
x |= (static_cast<Poco::UInt64>(byte) & 0x7F) << 42;
x |= (static_cast<UInt64>(byte) & 0x7F) << 42;
if (byte & 0x80)
{
readChar(byte, istr);
x |= (static_cast<Poco::UInt64>(byte) & 0x7F) << 49;
x |= (static_cast<UInt64>(byte) & 0x7F) << 49;
if (byte & 0x80)
{
readChar(byte, istr);
x |= (static_cast<Poco::UInt64>(byte) & 0x7F) << 56;
x |= static_cast<UInt64>(byte) << 56;
}
}
}
......@@ -275,31 +275,31 @@ void readVarUInt(UInt64 & x, ReadBuffer & istr)
char * writeVarUInt(UInt64 x, char * ostr)
{
*ostr = static_cast<Poco::UInt8>(x | 0x80);
*ostr = static_cast<UInt8>(x | 0x80);
if (x >= (1ULL << 7))
{
*++ostr = static_cast<Poco::UInt8>((x >> 7) | 0x80);
*++ostr = static_cast<UInt8>((x >> 7) | 0x80);
if (x >= (1ULL << 14))
{
*++ostr = static_cast<Poco::UInt8>((x >> 14) | 0x80);
*++ostr = static_cast<UInt8>((x >> 14) | 0x80);
if (x >= (1ULL << 21))
{
*++ostr = static_cast<Poco::UInt8>((x >> 21) | 0x80);
*++ostr = static_cast<UInt8>((x >> 21) | 0x80);
if (x >= (1ULL << 28))
{
*++ostr = static_cast<Poco::UInt8>((x >> 28) | 0x80);
*++ostr = static_cast<UInt8>((x >> 28) | 0x80);
if (x >= (1ULL << 35))
{
*++ostr = static_cast<Poco::UInt8>((x >> 35) | 0x80);
*++ostr = static_cast<UInt8>((x >> 35) | 0x80);
if (x >= (1ULL << 42))
{
*++ostr = static_cast<Poco::UInt8>((x >> 42) | 0x80);
*++ostr = static_cast<UInt8>((x >> 42) | 0x80);
if (x >= (1ULL << 49))
{
*++ostr = static_cast<Poco::UInt8>((x >> 49) | 0x80);
*++ostr = static_cast<UInt8>((x >> 49) | 0x80);
if (x >= (1ULL << 56))
{
*++ostr = static_cast<Poco::UInt8>((x >> 56) | 0x80);
*++ostr = static_cast<UInt8>(x >> 56);
}
else
*ostr &= 0x7F;
......@@ -333,31 +333,31 @@ const char * readVarUInt(UInt64 & x, const char * istr, size_t size)
{
const char * end = istr + size;
x = static_cast<Poco::UInt64>(*istr) & 0x7F;
x = static_cast<UInt64>(*istr) & 0x7F;
if (*istr & 0x80 && ++istr < end)
{
x |= (static_cast<Poco::UInt64>(*istr) & 0x7F) << 7;
x |= (static_cast<UInt64>(*istr) & 0x7F) << 7;
if (*istr & 0x80 && ++istr < end)
{
x |= (static_cast<Poco::UInt64>(*istr) & 0x7F) << 14;
x |= (static_cast<UInt64>(*istr) & 0x7F) << 14;
if (*istr & 0x80 && ++istr < end)
{
x |= (static_cast<Poco::UInt64>(*istr) & 0x7F) << 21;
x |= (static_cast<UInt64>(*istr) & 0x7F) << 21;
if (*istr & 0x80 && ++istr < end)
{
x |= (static_cast<Poco::UInt64>(*istr) & 0x7F) << 28;
x |= (static_cast<UInt64>(*istr) & 0x7F) << 28;
if (*istr & 0x80 && ++istr < end)
{
x |= (static_cast<Poco::UInt64>(*istr) & 0x7F) << 35;
x |= (static_cast<UInt64>(*istr) & 0x7F) << 35;
if (*istr & 0x80 && ++istr < end)
{
x |= (static_cast<Poco::UInt64>(*istr) & 0x7F) << 42;
x |= (static_cast<UInt64>(*istr) & 0x7F) << 42;
if (*istr & 0x80 && ++istr < end)
{
x |= (static_cast<Poco::UInt64>(*istr) & 0x7F) << 49;
x |= (static_cast<UInt64>(*istr) & 0x7F) << 49;
if (*istr & 0x80 && ++istr < end)
{
x |= (static_cast<Poco::UInt64>(*istr) & 0x7F) << 56;
x |= static_cast<UInt64>(*istr) << 56;
}
}
}
......
......@@ -2,6 +2,8 @@
#include <iostream>
#include <DB/IO/VarInt.h>
#include <DB/IO/WriteBufferFromString.h>
#include <DB/IO/ReadBufferFromString.h>
#include <Poco/NumberParser.h>
#include <Poco/HexBinaryEncoder.h>
......@@ -19,6 +21,24 @@ int main(int argc, char ** argv)
Poco::HexBinaryEncoder hex(std::cout);
DB::writeVarUInt(x, hex);
std::cout << std::endl;
std::string s;
{
DB::WriteBufferFromString wb(s);
DB::writeVarUInt(x, wb);
wb.next();
}
hex << s;
std::cout << std::endl;
DB::UInt64 y = 0;
DB::ReadBufferFromString rb(s);
DB::readVarUInt(y, rb);
std::cerr << "x: " << x << ", y: " << y << std::endl;
return 0;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册