in src/parquet/arrow/reader.cc [1059:1110]
static uint64_t BytesToInteger(const uint8_t* bytes, int32_t start, int32_t stop) {
using ::arrow::BitUtil::FromBigEndian;
const int32_t length = stop - start;
DCHECK_GE(length, 0);
DCHECK_LE(length, 8);
switch (length) {
case 0:
return 0;
case 1:
return bytes[start];
case 2:
return FromBigEndian(*reinterpret_cast<const uint16_t*>(bytes + start));
case 3: {
const uint64_t first_two_bytes =
FromBigEndian(*reinterpret_cast<const uint16_t*>(bytes + start));
const uint64_t last_byte = bytes[stop - 1];
return first_two_bytes << 8 | last_byte;
}
case 4:
return FromBigEndian(*reinterpret_cast<const uint32_t*>(bytes + start));
case 5: {
const uint64_t first_four_bytes =
FromBigEndian(*reinterpret_cast<const uint32_t*>(bytes + start));
const uint64_t last_byte = bytes[stop - 1];
return first_four_bytes << 8 | last_byte;
}
case 6: {
const uint64_t first_four_bytes =
FromBigEndian(*reinterpret_cast<const uint32_t*>(bytes + start));
const uint64_t last_two_bytes =
FromBigEndian(*reinterpret_cast<const uint16_t*>(bytes + start + 4));
return first_four_bytes << 16 | last_two_bytes;
}
case 7: {
const uint64_t first_four_bytes =
FromBigEndian(*reinterpret_cast<const uint32_t*>(bytes + start));
const uint64_t second_two_bytes =
FromBigEndian(*reinterpret_cast<const uint16_t*>(bytes + start + 4));
const uint64_t last_byte = bytes[stop - 1];
return first_four_bytes << 24 | second_two_bytes << 8 | last_byte;
}
case 8:
return FromBigEndian(*reinterpret_cast<const uint64_t*>(bytes + start));
default: {
DCHECK(false);
return UINT64_MAX;
}
}
}