c - 在C中将数组中的两个索引合并为一个

标签 c arrays

我有一个无符号字符数组,其中包含十六进制字节,如下所示:

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/

相关文章:

c - 我的 for 循环中的语法有什么问题?

python - 使用 pandas(和 glob?)合并目录中的大量(csv)数据文本文件

C 指针数组

javascript - 使用 Javascript 访问 JSON 数组?

c - Bash输出数据到文件

c - 如何查看我编译的机器语言/汇编代码?

c - 为什么浮点值条件在 'if' 条件下失败?

c - 哪个更有效率?重复分配或重复检查

javascript - 将数组从 URL 传递到 javascript

java - 复制数组的值