#include #include #include /* mock SnapRec (与 snapshot.h 一致, 64B) */ typedef struct { uint8_t magic; uint8_t len; uint8_t flags; uint8_t rsvd; uint32_t seq; uint32_t ts_ms; uint16_t boot_seq; uint16_t rsvd2; uint8_t coils[48]; } SnapRec; #define SNAP_COILS_MAX 4 #define SNAP_COIL_BYTES 12 int snap_rec_to_hex(const SnapRec *r, char *buf, int buf_len) { int i, pos = 0; const uint8_t *p = (const uint8_t *)r; for (i = 0; i < (int)sizeof(SnapRec); i++) { if (pos >= buf_len - 3) break; pos += snprintf(buf + pos, buf_len - pos, "%02x", p[i]); } return pos; } #define CHECK(cond) do { if (!(cond)) { printf("FAIL %d: %s\n", __LINE__, #cond); fails++; } else { passes++; } } while (0) static int passes = 0, fails = 0; int main(void) { char buf[256]; SnapRec r; /* 用例1: 与 test_snap_to_json case2 相同数据, 验证 hex 与 JSON 语义一致 ch1: cfg=0xE8(11 1 0 0000: 低频/方向/初始/灵敏度0) cond=0xFF(cond15/断/有车/relay) freq=0x00C383=50051, variation=-10, misc=128 */ memset(&r, 0, sizeof(r)); r.magic = 0xA6; r.len = 48; r.seq = 999; r.ts_ms = 1234; r.boot_seq = 3; r.coils[0] = 0xE8; r.coils[1] = 0xFF; r.coils[2] = 0x83; r.coils[3] = 0xC3; r.coils[4] = 0x00; /* 50051 */ r.coils[5] = 0xF6; r.coils[6] = 0xFF; r.coils[7] = 0xFF; /* -10 */ r.coils[8] = 0x80; r.coils[9] = 0x00; r.coils[10] = 0x00; r.coils[11] = 0x00; /* 128 */ int n = snap_rec_to_hex(&r, buf, sizeof(buf)); printf("hex(%d): %s\n", n, buf); CHECK(n == 128); CHECK(strlen(buf) == 128); /* 头部: magic=0xA6 len=0x30(48) flags=0 rsvd=0 seq=0xE7030000(999 LE) */ CHECK(strncmp(buf, "a6300000e7030000d204", 20) == 0); /* ch1 12B: e8 ff 83 c3 00 f6 ff ff 80 00 00 00 */ CHECK(strncmp(buf + 32, "e8ff83c300f6ffff80000000", 24) == 0); /* 全部小写 */ CHECK(strspn(buf, "0123456789abcdef") == 128); /* 用例2: 空记录 len=0 */ memset(&r, 0, sizeof(r)); r.magic = 0xA6; n = snap_rec_to_hex(&r, buf, sizeof(buf)); CHECK(n == 128); CHECK(strncmp(buf, "a60000000000000000000000", 24) == 0); /* 用例3: 缓冲不足截断安全 (buf_len=10 不越界) */ memset(&r, 0, sizeof(r)); n = snap_rec_to_hex(&r, buf, 10); CHECK(n == 8); CHECK(strlen(buf) == 8); printf("PASS=%d FAIL=%d\n", passes, fails); return fails ? 1 : 0; }