From e2b094d5b1e41ec4977fde1dd92aa3339c5244e4 Mon Sep 17 00:00:00 2001 From: Sven Robertz <sven@cs.lth.se> Date: Tue, 19 Feb 2013 16:07:33 +0100 Subject: [PATCH] simple implementation and test of packing ints --- lib/c/experimental/pack.c | 73 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 lib/c/experimental/pack.c diff --git a/lib/c/experimental/pack.c b/lib/c/experimental/pack.c new file mode 100644 index 0000000..1860964 --- /dev/null +++ b/lib/c/experimental/pack.c @@ -0,0 +1,73 @@ +#include <stdio.h> + + +unsigned char do_pack(unsigned char *buf, unsigned long i) +{ + printf("do_pack %lu == %lx\n", i, i); + + unsigned long tmp = i; + unsigned char res = 0; + + while ( tmp >= 0x80 ) { + buf[res] = (tmp & 0x7f) | 0x80; + tmp >>= 7; + res++; + } + buf[res] = tmp; + return res+1; +} + +unsigned long do_unpack(unsigned char *buf) +{ + unsigned long res=0; + unsigned char i=0; + unsigned char cont=1; + do { + res |= (buf[i] & 0x7f) << 7*i; + cont = buf[i++] & 0x80; + } while(cont); + + return res; +} + +void print_packed(unsigned char *buf, unsigned char len) +{ + int i; + + for(i=0; i<len;i++) { + printf("%2x ", buf[i]); + } + printf("\n"); +} + +int main() +{ + unsigned char buf[10]; + unsigned char len; + + len = do_pack(buf, 10); + print_packed(buf, len); + printf("... unpacks to %u\n\n", do_unpack(buf)); + + len = do_pack(buf, 100); + print_packed(buf, len); + printf("... unpacks to %u\n\n", do_unpack(buf)); + + len = do_pack(buf, 1000); + print_packed(buf, len); + printf("... unpacks to %u\n\n", do_unpack(buf)); + + len = do_pack(buf, 100000); + print_packed(buf, len); + printf("... unpacks to %u\n\n", do_unpack(buf)); + + len = do_pack(buf, 2345678901); + print_packed(buf, len); + printf("... unpacks to %u\n\n", do_unpack(buf)); + + len = do_pack(buf, 0xffffffffffffffff); + print_packed(buf, len); + printf("... unpacks to %lx\n", do_unpack(buf)); + + return 0; +} -- GitLab