Serilazer and deserealizer written in C.
at main 165 lines 3.0 kB view raw
1#include "string.h" 2#include <stdio.h> 3#include <stdint.h> 4#include <stdlib.h> 5 6typedef uint8_t Byte; 7 8typedef struct { 9 Byte* buf; 10 size_t cap; 11} Buffer; 12 13typedef struct { 14 char* str; 15 size_t cap; 16} String; 17 18typedef struct { 19 void* data; 20 String name; 21 size_t size; 22} Member; 23 24typedef struct { 25 Member* members; 26 size_t cap; 27} Members; 28 29Buffer serialize(Members src) { 30 Buffer buffer = { 31 .buf = (Byte*)malloc(sizeof(Byte) * 0xFF), 32 .cap = 0x100, 33 }; 34 35 size_t total_size = 0; 36 for (size_t i = 0; i < src.cap; ++i) { 37 Member mem = src.members[i]; 38 39 size_t required_size = sizeof(size_t) + mem.name.cap + sizeof(size_t) + mem.size; 40 41 while (total_size + required_size >= buffer.cap) { 42 buffer.buf = realloc(buffer.buf, buffer.cap * 2); 43 buffer.cap *= 2; 44 } 45 46 printf("[INFO]: New member:\n"); 47 printf("\tcap: %zu\n", mem.name.cap); 48 printf("\tname: %s\n", mem.name.str); 49 printf("\tsize: %zu\n", mem.size); 50 printf("\tdata location: %zu\n", (size_t)mem.data); 51 52 memcpy(buffer.buf + total_size, &mem.name.cap, sizeof(size_t)); 53 total_size += sizeof(size_t); 54 55 memcpy(buffer.buf + total_size, mem.name.str, mem.name.cap); 56 total_size += mem.name.cap; 57 58 memcpy(buffer.buf + total_size, &mem.size, sizeof(size_t)); 59 total_size += sizeof(size_t); 60 61 memcpy(buffer.buf + total_size, mem.data, mem.size); 62 total_size += mem.size; 63 } 64 65 66 buffer.buf = realloc(buffer.buf, total_size); 67 buffer.cap = total_size; 68 69 return buffer; 70} 71 72typedef struct { 73 size_t a; 74 uint32_t b; 75 uint8_t* c; 76 union { 77 uint16_t t16; 78 uint8_t t8_2[2]; 79 } d; 80} MyStruct; 81 82Members to_members(MyStruct ms) { 83 84 size_t cap = sizeof(size_t) + sizeof(uint32_t) + sizeof(uint8_t*) + sizeof(uint16_t); 85 Member* members = malloc(sizeof(Member) * cap); 86 87 members[0] = (Member){ 88 .data = &ms.a, 89 .name = { 90 .str = (char*)"a", 91 .cap = 2, 92 }, 93 .size = sizeof(size_t) 94 }; 95 96 members[1] = (Member){ 97 .data = &ms.b, 98 .name = { 99 .str = (char*)"b", 100 .cap = 2, 101 }, 102 .size = sizeof(uint32_t) 103 }; 104 105 members[2] = (Member){ 106 .data = &*ms.c, 107 .name = { 108 .str = (char*)"c", 109 .cap = 2, 110 }, 111 .size = sizeof(uint8_t*) 112 }; 113 114 members[3] = (Member){ 115 .data = &ms.d, 116 .name = { 117 .str = (char*)"c", 118 .cap = 2, 119 }, 120 .size = sizeof(uint16_t) 121 }; 122 123 return (Members){ 124 .members = members, 125 .cap = cap, 126 }; 127} 128 129int main() { 130 size_t a = 420; 131 void* aa = &a; 132 Byte buf[100] = {0}; 133 Buffer buffer = { 134 .buf = buf, 135 .cap = 100, 136 }; 137 memcpy(buffer.buf, aa, 8); 138 printf("[INFO]: %d\n", buffer.buf[0]); 139 printf("[INFO]: %d\n", buffer.buf[1]); 140 printf("[INFO]: %d\n", buffer.buf[2]); 141 printf("[INFO]: %d\n", buffer.buf[3]); 142 printf("[INFO]: %d\n", buffer.buf[4]); 143 printf("[INFO]: %d\n", buffer.buf[5]); 144 printf("[INFO]: %d\n", buffer.buf[7]); 145 /* 146 MyStruct ms = { 147 .a = 420, 148 .b = 60000, 149 .c = malloc(sizeof(uint8_t)), 150 .d.t8_2 = {[0] = 1, [1] = 2} 151 }; 152 153 Members mem = to_members(ms); 154 155 Buffer buffer = serialize(mem); 156 157 for (size_t i = 0; i < buffer.cap; ++i) { 158 printf("[%d] ", buffer.buf[i]); 159 } 160 161 free(buffer.buf); 162 free(mem.members); 163 */ 164 return 0; 165}