1+ #pragma once
2+
3+ #include < cstring> // for memcpy
4+
5+ typedef struct {
6+ float f1;
7+ float f2;
8+ float f3;
9+ char c1;
10+ } placeholder;
11+
12+ // easy to change which struct is being encoded/decoded
13+ #define CODE_T placeholder
14+
15+ // can change to char, short, int, long etc for different reliability/length tradeoffs
16+ #define CSUM_T int
17+
18+ namespace Coder {
19+ int get_packet_size () { // todo: when i tried size_t for ret type it told me i needed to include stddef.h
20+ return sizeof (CODE_T) + sizeof (CSUM_T);
21+ }
22+
23+ // encodes into buffer. buffer should be get_packet_size() bytes long.
24+ void encode_packet (const CODE_T &data, char *buffer) {
25+ memcpy (buffer, &data, sizeof (CODE_T));
26+
27+ CSUM_T csum = 0 ;
28+ const char *data_bytes = (const char *)&data;
29+ for (size_t i = 0 ; i < sizeof (CODE_T); i++) {
30+ csum += data_bytes[i];
31+ }
32+
33+ memcpy (buffer + sizeof (CODE_T), &csum, sizeof (CSUM_T));
34+ }
35+
36+ // decodes into data. buffer should be get_packet_size() bytes long.
37+ bool decode_packet (const char *buffer, CODE_T &data) {
38+ CSUM_T received_csum;
39+ memcpy (&received_csum, buffer + sizeof (CODE_T), sizeof (CSUM_T));
40+
41+ memcpy (&data, buffer, sizeof (CODE_T));
42+
43+ CSUM_T csum = 0 ;
44+ const char *data_bytes = (const char *)&data;
45+ for (size_t i = 0 ; i < sizeof (CODE_T); i++) {
46+ csum += data_bytes[i];
47+ }
48+
49+ return received_csum == csum;
50+ }
51+
52+ bool test () {
53+ CODE_T original;
54+ original.f1 = 1 .23f ;
55+ original.f2 = 4 .56f ;
56+ original.f3 = 7 .89f ;
57+ original.c1 = ' A' ;
58+
59+ const int packet_size = get_packet_size ();
60+ char *buffer = new char [packet_size];
61+
62+ encode_packet (original, buffer);
63+
64+ CODE_T decoded;
65+ bool success = decode_packet (buffer, decoded) && (original.f1 == decoded.f1 ) && (original.f2 == decoded.f2 ) && (original.f3 == decoded.f3 ) && (original.c1 == decoded.c1 );
66+
67+ buffer[3 ]++; // corrupt.
68+ bool fail_detected = !decode_packet (buffer, decoded);
69+ return success && fail_detected;
70+ }
71+
72+ } // namespace Coder
0 commit comments