-
-
Save hirokuma/fc5476f1bcf310863428883c1d47c7d5 to your computer and use it in GitHub Desktop.
var_int
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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