显然您想创建一个字符串,将数组中的值显示为十六进制。这可以通过循环遍历字符串相对容易地完成,并使用一些snprintf 魔法。但首先,让我们确定我们需要知道什么,以及如何获取这些信息:
- 为什么数组是大小
- 我们的目标字符串中每个值将占用多少个字符
- 我们如何访问数组,作为数组或指针(即:它是否传递给函数)
如果您有支持 C99 或 C11 的编译器,则可以使用 VLA。首先,假设您有一个数组(而不是指针):
const char * format = "%02x";//each value will be 2 chars + terminating 0
int array[] = { 123, 32, 4354, 544};
size_t arr_len = sizeof array/ sizeof *array;//get the nr of elements in the array
char string[arr_len*2 + 1];//nr of array elements *2 (chars) + terminating 0
for (int i=0;i<arr_len;++i)
{//this is where the magic happens:
snprintf(string + (i*2), 3, format, array[i]);
}
printf("The full hex string is: %s\n", string);
现在让我们看看这个位:snprintf(string + (i*2), 3, format, array[i]);
我正在使用string 数组,就好像它是一个指针,就好像string 包含一个指向string[0] 的内存地址。通过将i*2 添加到其中,我告诉snprintf 目标内存应该写入输出的位置从数组的第N 个元素开始。在第一次迭代中,i 为 0,因此 string + 0*2 == string + 0 == string,第二次为 string + (1*2) == string + 2 == &string[2]。有效地连接输出。
然后,我将 3 传递给 snprintf,告诉函数输出的最大长度为 3 个字符(包括终止 \0 字符)。这非常适合来自我们格式 "%02x" 的 2 个十六进制字符 + \0。然后通过array[i] 将十六进制值添加到字符串的末尾就很简单了。
太好了,现在如果 array 被传递给一个函数,和/或你没有 VLA 怎么办?和上面一样,有一些不同。您必须计算数组的长度并将其传递给函数(计算方法如上所示)。您还必须自己为字符串分配内存(并释放它),这也不应该太难:
char * get_hex_string(int *arr, size_t arr_len)
{
char * string = malloc((arr_len * 2 + 1) * sizeof *string);//the sizeof *string is optional
if (string == NULL)
return NULL;
string[0] = '\0';//clear first char, just in case
for (int i=0;i<arr_len;++i)
snprintf(string + i*2, 3, "%02x", arr[i]);//same as before
string[arr_len*2] = '\0';//optional, just a habit of mine
return string;//return string
}
int main( void )
{
int array[] = {12, 32, 54, 1, 6};
char *as_string = get_hex_string(array, sizeof array/sizeof *array);
if (as_string == NULL)
{
fprintf(stderr, "Failed to get hex-string\n");
exit( EXIT_FAILURE );
}
printf("Hex-string: %s\n", as_string);
free(as_string);//optional here, but good habit
return EXIT_SUCCESS;
}