我有一个无符号字符数组,其中包含十六进制字节,如下所示:
unsigned char array[255];
array[0] = 'F';
array[1] = 'F';
array[2] = 'E';
array[3] = '2';
array[4] = 'A';
array[5] = 'A';
array[6] = 'C';
array[7] = 'C';
我想合并它们,使其成为:
array[0] = "FF"
array[1] = "E2"
array[2] = "AA"
array[3] = "CC"
array[0] = '\xFF';
array[1] = '\xE2';
array[2] = '\xAA';
array[3] = '\xCC';
我尝试过使用sprintf
,但后来我不知道如何在其中指定索引号。有什么帮助吗?
最佳答案
那么,您想将由十六进制字符组成的字符串转换为字节数组,对吗?了解您的数据。
sprintf()
不会帮助您,因为它会生成字符串。相反,您需要提取每个十六进制字符的“值”并使用它来计算字节的值。
因此,让我们创建一个辅助函数来将十六进制字符转换为其整数值(如果无效则为 -1)。我们将使用字符的 ASCII 值以及字符范围在 ASCII 表中是连续的这一事实
int char2hexa(unsigned char c)
{
if(c >= '0' && c <= '9') {
return (c - '0'); /* will return 0-9 */
} else if(c >= 'A' && c <= 'F') {
return (c - 'A') + 10; /* will return 10-15 */
} else if(c >= 'a' && c <= 'f') {
return (c - 'a') + 10; /* will return 10-15 */
} else {
return -1;
}
}
现在,一个字节将由两个十六进制值构造而成,使用一个作为高半字节(乘以 16 或左移 4),另一个作为低半字节,所以让我们有一个函数:
unsigned char hexvals2byte(int upper, int lower)
{
return (upper * 16 + lower);
}
并将各个部分组合在一起。我假设:
- 您知道输入数据的长度
- 长度是偶数(每个字节需要两个字符)
- 您想将结果放入同一个数组中
来了。
#include <stdio.h>
#include <stdlib.h>
unsigned char array[255];
array[0] = 'F';
array[1] = 'F';
array[2] = 'E';
array[3] = '2';
array[4] = 'A';
array[5] = 'A';
array[6] = 'C';
array[7] = 'C';
unsigned length = 8;
int upper, lower;
for(int i = 0; i < length; i+=2) {
upper = char2hexa(array[i]);
lower = char2hexa(array[i+1]);
if(upper < 0 || lower < 0) {
/* handle input data format error */
fprintf(stderr, "ERROR: Cannot decode hexa values '%c%c'\n", array[i], array[i+1]);
exit(EXIT_FAILURE);
}
array[i/2] = hexvals2byte(upper, lower);
}
关于c - 在C中将数组中的两个索引合并为一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43862475/