首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C中正确地将十六进制字符串转换为Byte?

如何在C中正确地将十六进制字符串转换为Byte?
EN

Stack Overflow用户
提问于 2013-08-16 07:14:15
回答 4查看 28.1K关注 0票数 5

我需要将包含十六进制值的字符串转换为字节数组。虽然already here已经回答了这个问题,但我得到了以下错误:

代码语言:javascript
复制
warning: ISO C90 does not support the ‘hh’ gnu_scanf length modifier [-Wformat]

因为我不喜欢警告,而省略hh只会产生另一个警告

代码语言:javascript
复制
warning: format ‘%x’ expects argument of type ‘unsigned int *’, but argument 3 has type ‘unsigned char *’ [-Wformat]

我的问题是:如何做好这件事?为了完成,我再次在这里发布示例代码:

代码语言:javascript
复制
#include <stdio.h>

int main(int argc, char **argv)
{
    const char hexstring[] = "deadbeef10203040b00b1e50", *pos = hexstring;
    unsigned char val[12];
    size_t count = 0;

     /* WARNING: no sanitization or error-checking whatsoever */
    for(count = 0; count < sizeof(val)/sizeof(val[0]); count++) {
        sscanf(pos, "%2hhx", &val[count]);
        pos += 2 * sizeof(char);
    }

    printf("0x");
    for(count = 0; count < sizeof(val)/sizeof(val[0]); count++)
        printf("%02x", val[count]);
    printf("\n");

    return(0);
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-08-16 07:22:41

您可以使用strtol()代替。

只需替换这一行:

代码语言:javascript
复制
sscanf(pos, "%2hhx", &val[count]);

通过以下方式:

代码语言:javascript
复制
char buf[10];
sprintf(buf, "0x%c%c", pos[0], pos[1]);
val[count] = strtol(buf, NULL, 0);

UPDATE:您可以避免使用此片段的sprintf()

代码语言:javascript
复制
char buf[5] = {"0", "x", pos[0], pos[1], 0};
val[count] = strtol(buf, NULL, 0);
票数 4
EN

Stack Overflow用户

发布于 2013-08-16 07:31:56

您可以将编译器切换到C99模式( hh长度修饰符在C99中是标准化的),也可以使用unsigned int临时变量:

代码语言:javascript
复制
unsigned int byteval;
if (sscanf(pos, "%2x", &byteval) != 1)
{
    /* format error */
}
val[count] = byteval;
票数 2
EN

Stack Overflow用户

发布于 2017-01-25 01:12:38

为什么不使用sscanf,strol等来做呢?下面是HexToBin,作为一个自由蜜蜂,BinToHex。(注意,最初有通过错误日志系统返回的枚举错误代码,而不是简单的-1返回。)

代码语言:javascript
复制
unsigned char HexChar (char c)
{
    if ('0' <= c && c <= '9') return (unsigned char)(c - '0');
    if ('A' <= c && c <= 'F') return (unsigned char)(c - 'A' + 10);
    if ('a' <= c && c <= 'f') return (unsigned char)(c - 'a' + 10);
    return 0xFF;
}

int HexToBin (const char* s, unsigned char * buff, int length)
{
    int result;
    if (!s || !buff || length <= 0) return -1;

    for (result = 0; *s; ++result)
    {
        unsigned char msn = HexChar(*s++);
        if (msn == 0xFF) return -1;
        unsigned char lsn = HexChar(*s++);
        if (lsn == 0xFF) return -1;
        unsigned char bin = (msn << 4) + lsn;

        if (length-- <= 0) return -1;
        *buff++ = bin;
    }
    return result;
}

void BinToHex (const unsigned char * buff, int length, char * output, int outLength)
{
    char binHex[] = "0123456789ABCDEF";

    if (!output || outLength < 4) return;
    *output = '\0';

    if (!buff || length <= 0 || outLength <= 2 * length)
    {
        memcpy(output, "ERR", 4);
        return;
    }

    for (; length > 0; --length, outLength -= 2)
    {
        unsigned char byte = *buff++;

        *output++ = binHex[(byte >> 4) & 0x0F];
        *output++ = binHex[byte & 0x0F];
    }
    if (outLength-- <= 0) return;
    *output++ = '\0';
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18267803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档