如何将祸不单行字符串转换为uint8_t数组?(C语言) [英] How to convert a hex string to a uint8_t array? (C language)
本文介绍了如何将祸不单行字符串转换为uint8_t数组?(C语言)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
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屋!
查看全文