我正試圖編寫一個C程序,其中來自命令行參數的輸入格式爲0x1234aabb
。將命令行輸入字符串解析爲char數組
這絕對是作爲char *[]
在程序中。
現在,我想以char a[]={0x12, 0x34, 0xaa, 0xbb}
的形式存儲此輸入。
請幫忙。
我正試圖編寫一個C程序,其中來自命令行參數的輸入格式爲0x1234aabb
。將命令行輸入字符串解析爲char數組
這絕對是作爲char *[]
在程序中。
現在,我想以char a[]={0x12, 0x34, 0xaa, 0xbb}
的形式存儲此輸入。
請幫忙。
如果您知道該字符串始終是一個固定長度(如10個字符作爲你的例子),那麼你可以分割字符串分成四個等份每三個字符長(兩位用於數字,一位用於終結符),然後在每個部件上使用strtoul
。如果參數少於十個字符,則只填寫相關部分,並保留另一個爲"00"
。
我會首先做的是使用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
您的輸出是倒退。 OP需要'0x12 0x34 0xaa 0zbb'命令中的字節,但是您將它們存儲在'0xbb 0xaa 0x34 0x12'命令中。 – 2012-07-28 01:08:20
@RemyLebeau:是的,我知道,如果他需要相反的順序('bytes [NUM_BYTES-1-i]'),他可以對代碼進行簡單的修改。 – AusCBloke 2012-07-28 01:22:28
'strtoul()'最多可處理4個字節,'strtoull()'最多8個字節。除此之外的任何事情(他需要多達16個字節)都需要手動解析。 – 2012-07-28 01:48:55
嘗試這樣的事情來解析任意長度的輸入:
#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;
}
你可以用'strtoll'將一個字符串解析爲一個數字。 – Ryan 2012-07-27 23:14:23
thnaks..works但我想我需要做一些更多的因爲輸入字符串是16bytes(32個字符) – user1558886 2012-07-27 23:51:51