From 45156e64a0d585cb1f2341bda3cae2b42c6f6eba Mon Sep 17 00:00:00 2001 From: Thomas Kolb Date: Sun, 27 Feb 2022 22:01:51 +0100 Subject: [PATCH] Show packets as hexdump instead of text --- impl/src/main.c | 47 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/impl/src/main.c b/impl/src/main.c index 564b390..b472478 100644 --- a/impl/src/main.c +++ b/impl/src/main.c @@ -3,6 +3,8 @@ #include #include #include +#include + #include #include @@ -34,6 +36,47 @@ void print_complex_array(const char *varname, float complex const *array, size_t } +void hexdump(const uint8_t *data, size_t len) +{ + static const char lut[16] = "0123456789ABCDEF"; + static const size_t BYTES_PER_LINE = 16; + + size_t pos = 0; + + while(pos < len) { + size_t bytes_in_line = len - pos; + if(bytes_in_line > BYTES_PER_LINE) { + bytes_in_line = BYTES_PER_LINE; + } + + for(size_t i = 0; i < BYTES_PER_LINE; i++) { + if(i >= bytes_in_line) { + fputs(" ", stderr); + } else { + uint8_t byte = data[pos+i]; + + fprintf(stderr, "%c%c ", lut[byte >> 4], lut[byte & 0x0F]); + } + } + + fputs(" ", stderr); + + for(size_t i = 0; i < bytes_in_line; i++) { + uint8_t byte = data[pos+i]; + + if(isprint(byte)) { + putc(byte, stderr); + } else { + putc('.', stderr); + } + } + + putc('\n', stderr); + pos += bytes_in_line; + } +} + + void cb_rx(rx_evt_t evt, uint8_t *packet_data, size_t packet_len) { int ret; @@ -43,13 +86,13 @@ void cb_rx(rx_evt_t evt, uint8_t *packet_data, size_t packet_len) case RX_EVT_CHECKSUM_ERROR: fprintf(stderr, "Received a message of %zu bytes, but decoding failed.\n", packet_len); //fprintf(stderr, "=== FAILED PAYLOAD ===\n"); - //fprintf(stderr, "%s\n", packet_data); + //hexdump(packet_data, packet_len); //fprintf(stderr, "=======================\n"); break; case RX_EVT_PACKET_RECEIVED: fprintf(stderr, "=== DECODED PAYLOAD (%4zu bytes) ===\n", packet_len); - fprintf(stderr, "%s\n", packet_data); + hexdump(packet_data, packet_len); fprintf(stderr, "====================================\n"); ret = write(m_tunfd, packet_data, packet_len);