bookmark_borderASCII格式与Hex十六进制格式转换

ascii转hex

int Ascii2Hex(const char* ascii, char* hex)
{
    int i, len = strlen(ascii);
    char chHex[] = "0123456789ABCDEF";

    for (i = 0; i<len; i++)
    {
        hex[i * 3] = chHex[((BYTE)ascii[i]) >> 4];
        hex[i * 3 + 1] = chHex[((BYTE)ascii[i]) & 0xf];
        hex[i * 3 + 2] = ' ';
    }

    hex[len * 3] = '\0';

    return len * 3;
}

hex转ascii

int Hex2Ascii(const char* hex, char* ascii, int maxCount)
{
    int len = strlen(hex), tlen, i, cnt;

    for (i = 0, cnt = 0, tlen = 0; i<len && tlen < maxCount; i++)
    {
        char c = toupper(hex[i]);

        if ((c >= '0'&& c <= '9') || (c >= 'A'&& c <= 'F'))
        {
            BYTE t = (c >= 'A') ? c - 'A' + 10 : c - '0';

            if (cnt)
                ascii[tlen++] += t, cnt = 0;
            else
                ascii[tlen] = t << 4, cnt = 1;
        }
    }

    return tlen;
}

hexdump函数

void hexdump(const void* _data, uint32_t size)
{
    const uint8_t* data = (const uint8_t*)_data;
    unsigned int offset = 0;

    while (offset < size)
    {
        printf("%08x  ", offset);
        size_t n = size - offset;

        if (n > 16)
        {
            n = 16;
        }

        for (size_t i = 0; i < 16; ++i)
        {
            if (i == 8)
            {
                printf(" ");
            }

            if (offset + i < size)
            {
                printf("%02x ", data[offset + i]);
            }
            else
            {
                printf("   ");
            }
        }

        printf(" ");

        for (size_t i = 0; i < n; ++i)
        {
            if (isprint(data[offset + i]))
            {
                printf("%c", data[offset + i]);
            }
            else
            {
                printf(".");
            }
        }

        printf("\n");
        offset += 16;
    }
}