summaryrefslogtreecommitdiff
path: root/src/hexdump/hexdump.cpp
blob: 7025fb05823f4b3218975fb39571efe144e070b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "hexdump.h"

void hexdump_to_fd(int fd, const char *data, uint16_t len)
{
    uint16_t i = 0;
    uint16_t used = 0;
    uint16_t offset = 0;

#define LINE_LEN 80
    char line[LINE_LEN]; /* space needed 8+16*3+3+16 == 75 */

    dprintf(fd, "dump data at [%p], len=%u\n", data, len);
    while (offset < len)
    {
        /* format the line in the buffer, then use printf to usedput to screen */
        used = snprintf(line, LINE_LEN, "%08X:", offset);
        for (i = 0; ((offset + i) < len) && (i < 16); i++)
        {
            used += snprintf(line + used, LINE_LEN - used, " %02X", (data[offset + i] & 0xff));
        }
        for (; i <= 16; i++)
        {
            used += snprintf(line + used, LINE_LEN - used, " | ");
        }
        for (i = 0; (offset < len) && (i < 16); i++, offset++)
        {
            unsigned char c = data[offset];
            if ((c < ' ') || (c > '~'))
            {
                c = '.';
            }
            used += snprintf(line + used, LINE_LEN - used, "%c", c);
        }
        dprintf(fd, "%s\n", line);
    }
    dprintf(fd, "\n");
}