Skip to content

Instantly share code, notes, and snippets.

@hirokuma
Created December 11, 2024 08:36
Show Gist options
  • Save hirokuma/fc5476f1bcf310863428883c1d47c7d5 to your computer and use it in GitHub Desktop.
Save hirokuma/fc5476f1bcf310863428883c1d47c7d5 to your computer and use it in GitHub Desktop.
var_int
#include <stdio.h>
#include <stdint.h>
void check_value(const char* p_title, uint64_t expect, uint64_t challange)
{
printf("%s: ", p_title);
if (challange == expect) {
printf("OK!\n");
} else {
printf("NG......\n");
}
}
uint64_t varint(const uint8_t *p_varint)
{
uint64_t val;
if (p_varint[0] < 0xfd) {
val = p_varint[0];
} else if (p_varint[0] == 0xfd) {
val = ((uint16_t)p_varint[2] << 8) | p_varint[1];
} else if (p_varint[0] == 0xfe) {
val = ((uint32_t)p_varint[4] << 24) |
((uint32_t)p_varint[3] << 16) |
((uint32_t)p_varint[2] << 8) |
(uint32_t)p_varint[1];
} else {
val = ((uint64_t)p_varint[8] << 56) |
((uint64_t)p_varint[7] << 48) |
((uint64_t)p_varint[6] << 40) |
((uint64_t)p_varint[5] << 32) |
((uint64_t)p_varint[4] << 24) |
((uint64_t)p_varint[3] << 16) |
((uint64_t)p_varint[2] << 8) |
p_varint[1];
}
return val;
}
int main(void)
{
uint64_t val;
{
// 1byte min
const uint8_t data[] = { 0x00 };
val = varint(data);
check_value("1byte min", 0x00, val);
}
{
// 1byte max
const uint8_t data[] = { 0xfc };
val = varint(data);
check_value("1byte max", 0xfc, val);
}
{
// 2byte min
const uint8_t data[] = { 0xfd, 0xfd, 0x00 };
val = varint(data);
check_value("2byte min", 0xfd, val);
}
{
// 2byte max
const uint8_t data[] = { 0xfd, 0xff, 0xff };
val = varint(data);
check_value("2byte max", 0xffff, val);
}
{
// 4byte min
const uint8_t data[] = { 0xfe, 0x00, 0x00, 0x01, 0x00 };
val = varint(data);
check_value("4byte min", 0x010000, val);
}
{
// 4byte max
const uint8_t data[] = { 0xfe, 0xff, 0xff, 0xff, 0xff };
val = varint(data);
check_value("4byte max", 0xffffffff, val);
}
{
// 8byte min
const uint8_t data[] = { 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00 };
val = varint(data);
check_value("8byte min", 0x0100000000, val);
}
{
// 4byte max
const uint8_t data[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
val = varint(data);
check_value("4byte max", 0xffffffffffffffff, val);
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment