繁体   English   中英

将ASCII字符串数组转换为其十六进制值数组

[英]Convert ASCII string array into its hex value array

我有一个包含ASCII字符的char数组。 我需要知道如何获取每个字符的十六进制值并将其保存在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 +处理器编写的程序。 我不仅在查看传入的数据,还在下一步中处理这些数据。 因此,不使用printf

首先,像所有其他字符串函数一样, strtol期望以null终止的 字节字符串 ,而不是单个字符。

其次,字符编码值是字符串中元素的实际值。 如果使用正确的格式说明符来打印十进制值65 (例如),那么将打印字符A

printf("%c\n", 65);  // Will print an A

同样,将字符'A'打印为十进制整数将打印值65

printf("%d\n", 'A');  // Will print the value 65

因此,您所需要做的就是以正确的格式打印数组中的值。


此外...最近几十年来计算机上的所有值都以二进制存储。 他们全部。

十进制,八进制或十六进制就是显示值的方式。 存储0x416101010b01000001 (用于与二进制符号的扩展编译器)并不重要,因为在端部将是存储的二进制值。 如果要通过某些输出向用户显示十六进制值,则必须在打印或写入二进制格式时将其格式化。

  1. 说C char是最小的可用整数值。
  2. 用C和ASCII表示字符文字(例如'A' )只是int值的另一种表示形式(此处为65 )。
  3. 在讲数学时,除了十进制方式(使用基数10)之外,还有其他方法可以表示相同的值。 一种常见的做法是使用16的底数(十六进制)。

综上所述,可以证明:

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";

实际上已经是五个(小)整数的整数数组。

如果使用正确的转换说明符长度修饰符打印,您将看到所需内容。

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);

您可以使用基本算法(即除以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/

希望这可以帮助 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM