我有一个char
数组,其中包含ASCII字符。我需要知道如何获取每个字符的十六进制值并将其保存在uint8_t
数组中。
例如如果我有
array[5] = "ABCDE"
输出应为
output[5] = {0x41, 0x42, 0x43, 0x44, 0x45}
我尝试使用strtol
,但是没有用。
for(unsigned i = 0; i < 32; i++) {
message[i] = (uint8_t)strtol(&incoming_message[i], NULL, 16);
}
Output:
A 0 0 0 0 0 0 0 0 0 F 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
更新:这是针对我正在为Cortex-M0+ processor编写的程序。我不仅在查看传入的数据,还在下一步中处理这些数据。因此,请勿使用printf
答案 0 :(得分:4)
首先,strtol
像所有其他字符串函数一样,期望的是 空终止 字节字符串,而不是单个字符。
第二,字符编码值是字符串中元素的实际值。例如,如果使用正确的格式说明符打印十进制值65
,则将打印字符A
:
printf("%c\n", 65); // Will print an A
类似地,将字符'A'
打印为十进制整数将打印值65
:
printf("%d\n", 'A'); // Will print the value 65
因此,您所需要做的就是以正确的格式打印数组中的值。
此外... 过去几十年中计算机上的所有值都存储在 binary 中。全部。
十进制,八进制或十六进制就是显示值的方式。存储0x41
,61
,0101
或0b01000001
(对于具有二进制符号扩展名的编译器)无关紧要,因为最后将存储二进制值。如果要通过某些输出向用户显示十六进制值,则在打印或写入二进制值时必须设置其格式。
答案 1 :(得分:4)
char
是可用的最小整数值。'A'
)只是 int
值(此处为65
)的另一种表示形式。将以上内容放在一起可以证明:
int i = 'A';
char c = i;
与:
相同int i = 65;
char c = i;
且与:
int i = 0x41;
char c = i;
且与:
char c = 'A';
且与:
char c = 65;
且与:
char c = 0x41;
所以
char a[5] = "ABCDE";
实际上已经是五个(小)整数的整数数组。
如果使用正确的转换说明符 和 length修饰符打印,您将看到所需的内容。
for (size_t i = 0; i < 5; ++i)
{
printf("%hhx ", a[i]);
}
输出:
41 42 43 44 45
为了向读者表明这一点,应将其视为十六进制值,可以使用常见的0x
表示法将该值作为前缀
printf("0x%hhx ", a[i]);
给你的
0x41 0x42 0x43 0x44 0x45
如果您要向Pascal的人展示,也许您会使用
printf("$%hhx ", a[i]);
给你的
$41 $42 $43 $44 $45
要看看角色本身就是我们:
printf("%c ", a[i]);
并获得
A B C D E
要查看十进制值,请使用
printf("%d ", a[i]);
并获得
65 66 67 68 69
结论是,这完全取决于您如何表示(“打印”) 相同的值 (a
元素的内容)。当创建具有非常相同值的表示形式(通过打印并传递正确的“指令”)时,即仅在输出期间,就会发生“转换”。
仅指ASCII,这意味着所有值都为<128,因此您可以使用一个循环简单地复制数组的值
char src[5] = "ABCDE";
uint8_t dst[5];
for (size_t i = 0 i < 5; ++i)
{
dst[i] = src[i];
}
或一次复制相关的内存块
memcpy(dst, src, 5);
答案 2 :(得分:-1)
您可以使用基本算法将值转换为十六进制,即除以16。 我创建了以下函数,您可以在其中传递要转换的字符串,并在其中获得响应的字符串数组。
void hexCon(char str[],char result[][5]){
int i,check,rem = 0;
char res[20],res2[20];
int len = 0;
char temp;
for(i=0; i < strlen(str) ; i++){
len=0;
check = str[i];
while(check > 0){
rem = check%16;
switch(rem){
case 10:temp='A';break;
case 11:temp='B';break;
case 12:temp='C';break;
case 13:temp='D';break;
case 14:temp='E';break;
case 15:temp='F';break;
default:temp=rem + '0';
}
res[len] = temp;
check = check /16;
len++;
}
reverse(res,len,res2); //reversing the digits
res2[len] = '\0'; //adding null character at the end of string
strcpy(result[i],res2); //copying all data to result array
}
}
其中反向功能是:
void reverse(char str[], int size, char rev[])
{
int i=0,j=0;
for(i=size-1 , j=0 ; i >= 0; i-- , j++ ){
rev[j] = str[i];
}
}
您可以这样称呼它:
void main(){
char str[]="ABCDE";
char result[strlen(str)][5];
int i;
hexCon(str,result);
for(i =0 ;i < strlen(str); i++){
printf("%s\n",result[i]);
}
}
使用的算法在这里说明:- https://www.permadi.com/tutorial/numDecToHex/
希望这会有所帮助:)