我正在尝试编写一个 C 程序,其中命令行参数的输入格式为0x1234aabb
.
这绝对是作为 char 出现在程序中的*[]
。
现在,我想以char a[]={0x12, 0x34, 0xaa, 0xbb}
.
请帮忙。
我正在尝试编写一个 C 程序,其中命令行参数的输入格式为0x1234aabb
.
这绝对是作为 char 出现在程序中的*[]
。
现在,我想以char a[]={0x12, 0x34, 0xaa, 0xbb}
.
请帮忙。
我首先要做的是使用strtoul
16(十六进制)的基本参数将字符串解析为整数。unsigned long
保证大小至少为 32 位,因此如果您的所有数字都有 8 个十六进制数字(4 个字节),那么它应该是合适的类型。
一旦你有了你的数字,位移和按位与数字 4 次以提取组成数字的 4 个字节中的每一个。这是一个例子:
#include <stdlib.h>
#include <stdio.h>
#define NUM_BYTES 4
int main(void)
{
char *input = "0x1234aabb";
unsigned long num = strtoul(input, NULL /* TODO: error checking */, 16);
unsigned char bytes[NUM_BYTES];
unsigned i;
printf("The number is: 0x%lx\n", num);
/* bytes[0] = LSB, bytes[NUM_BYTES - 1] = MSB */
for (i = 0; i < NUM_BYTES; i++) {
bytes[i] = (num >> 8*i) & 0xFF; /* byte = 8 bits, 0xFF = max byte value */
printf("Byte %u: 0x%x\n", i+1, bytes[i]);
}
return 0;
}
输出:
The number is: 0x1234aabb
Byte 1: 0xbb
Byte 2: 0xaa
Byte 3: 0x34
Byte 4: 0x12
如果您知道字符串始终是固定长度(例如,在您的示例中为 10 个字符),那么您可以将字符串分成四个相等的部分,每三个字符长(两个用于数字,一个用于终止符),然后使用strtoul
on每个部分。如果参数少于十个字符,只填写相关部分,其他部分保留"00"
。
尝试这样的事情来解析任意长度的输入:
#include <stdio.h>
int main(int argc, char** argv)
{
char *input;
int len;
int num;
char *a;
int i;
int tmp;
if (argv < 2)
{
printf("No input specified!\n");
return 0;
}
input = argv[1]; // "0x1234aabb"
if (strncmpi(input, "0x", 2) != 0)
{
printf("Bad input!\n");
return 0;
}
printf("Input: %s\n", input);
input += 2;
len = strlen(input);
num = (len / 2) + (len % 2);
if (num < 1)
{
printf("Bad input!\n");
return 0;
}
printf("Number of bytes: %d\n", num);
a = (char*) calloc(num, sizeof(char));
if (a == NULL)
{
printf("Cannot allocate memory for bytes!\n");
return 0;
}
for (i = 0; i < num; ++i)
{
if (sscanf(input, "%2x", &tmp) != 1)
{
printf("Byte %d: Illegal byte value '%02s'\n", i+1, input);
break;
}
a[i] = (char) tmp;
printf("Byte %d: 0x%02x\n", i+1, a[i]);
input += 2;
}
free(a);
return 0;
}