如何将祸不单行字符串转换为uint8_t数组?(C语言) [英] How to convert a hex string to a uint8_t array? (C language)

查看:25
本文介绍了如何将祸不单行字符串转换为uint8_t数组?(C语言)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何将祸不单行字符串转换为uint8_t数组? 我的字符串是02012B1530A6E3958A98530031902003876940000000000CDF9844173BE512AFFFFFFE11DBBA1F00079387800E13012E11FC017FFFFFFFFE39C10F40 并且我想将其转换为以下数组:

uint8_t array_uint[] = {0x02, 0x01, 0x2B, 0x15, 0x30, 0xA6, 0xE3, 0x95, 0x8A, 0x98, 0x53, 0x00, 0x31, 0x90, 0x20, 0x03, 0x87, 0x69, 0x40, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xDF, 0x98, 0x44, 0x17, 0x3B, 0xE5, 0x12, 0xAF, 0xFF, 0xFF, 0xFE, 0x11, 0xDB, 0xBA, 0x1F, 0x00, 0x07, 0x93, 0x87, 0x80, 0x0E, 0x13, 0x01, 0x2E, 0x11, 0xFC, 0x01, 0x7F, 0xFF, 0xFF, 0xFF, 0xFE, 0x39, 0xC1, 0x0F, 0x40};

感谢您的帮助!

推荐答案

您可以使用sscanf()一次将两个字节从源字符串转换为目标数组:

#include <stdint.h>
#include <stdio.h>

size_t convert_hex(uint8_t *dest, size_t count, const char *src) {
    size_t i;
    int value;
    for (i = 0; i < count && sscanf(src + i * 2, "%2x", &value) == 1; i++) {
        dest[i] = value;
    }
    return i;
}
但是请注意,在标准库为每个sscanf()调用计算源字符串长度的体系结构上,此方法可能效率低下,时间复杂度为二次。使用中间数组可以解决此问题:

#include <stdint.h>
#include <stdio.h>

size_t convert_hex(uint8_t *dest, size_t count, const char *src) {
    char buf[3];
    size_t i;
    int value;
    for (i = 0; i < count && *src; i++) {
        buf[0] = *src++;
        buf[1] = '';
        if (*src) {
            buf[1] = *src++;
            buf[2] = '';
        }
        if (sscanf(buf, "%x", &value) != 1)
            break;
        dest[i] = value;
    }
    return i;
}

将转换结果直接存储到dest数组很简单:

#include <stdint.h>
#include <stdio.h>

size_t convert_hex(uint8_t *dest, size_t count, const char *src) {
    char buf[3];
    size_t i;
    for (i = 0; i < count && *src; i++) {
        buf[0] = *src++;
        buf[1] = '';
        if (*src) {
            buf[1] = *src++;
            buf[2] = '';
        }
        if (sscanf(buf, "%hhx", &dest[i]) != 1)
            break;
    }
    return i;
}

纯粹主义者可能会争辩说,%hhx需要指向unsigned char而不是uint8_t的指针,因此格式应该是"%"SCNx8"%2"SCNx8(在<inttypes.h>中定义),但是这些替代方案可读性较差,而且没有必要,因为类型uint8_t总是与定义它的体系结构上的类型unsigned char相同。

这篇关于如何将祸不单行字符串转换为uint8_t数组?(C语言)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆