chunkstream support full uint
This commit is contained in:
@@ -79,6 +79,11 @@ uint ChunkStream::readVInt(QDataStream & s) {
|
||||
uchar bytes[4];
|
||||
s >> bytes[0];
|
||||
uchar abc = 0;
|
||||
if (bytes[0] == 0xf0) {
|
||||
abc = 3;
|
||||
for (int i = 0; i < 4; ++i)
|
||||
s >> bytes[i];
|
||||
} else {
|
||||
for (abc = 0; abc < 3; ++abc) {
|
||||
uchar mask = (0x80 >> abc);
|
||||
if ((bytes[0] & mask) == mask) {
|
||||
@@ -88,6 +93,7 @@ uint ChunkStream::readVInt(QDataStream & s) {
|
||||
} else
|
||||
break;
|
||||
}
|
||||
}
|
||||
uint ret = 0;
|
||||
for (int i = 0; i <= abc; ++i) {
|
||||
ret += (bytes[i] << (8 * ((int)abc - i)));
|
||||
@@ -97,18 +103,15 @@ uint ChunkStream::readVInt(QDataStream & s) {
|
||||
|
||||
|
||||
void ChunkStream::writeVInt(QDataStream & s, uint val) {
|
||||
if (val > 0xfffffff) return;
|
||||
if (val <= 0x7f) {
|
||||
s << uchar(val);
|
||||
return;
|
||||
}
|
||||
if (val <= 0x3fff) {
|
||||
} else if (val <= 0x3fff) {
|
||||
s << uchar((val >> 8) | 0x80) << uchar(val & 0xff);
|
||||
return;
|
||||
}
|
||||
if (val <= 0x1fffff) {
|
||||
} else if (val <= 0x1fffff) {
|
||||
s << uchar((val >> 16) | 0xc0) << uchar((val >> 8) & 0xff) << uchar(val & 0xff);
|
||||
return;
|
||||
}
|
||||
} else if (val <= 0xfffffff) {
|
||||
s << uchar((val >> 24) | 0xe0) << uchar((val >> 16) & 0xff) << uchar((val >> 8) & 0xff) << uchar(val & 0xff);
|
||||
} else {
|
||||
s << uchar(0xf0) << uchar((val >> 24) & 0xff) << uchar((val >> 16) & 0xff) << uchar((val >> 8) & 0xff) << uchar(val & 0xff);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user