2012-07-27 99 views
0

我正試圖編寫一個C程序,其中來自命令行參數的輸入格式爲0x1234aabb將命令行輸入字符串解析爲char數組

這絕對是作爲char *[]在程序中。

現在,我想以char a[]={0x12, 0x34, 0xaa, 0xbb}的形式存儲此輸入。

請幫忙。

+0

你可以用'strtoll'將一個字符串解析爲一個數字。 – Ryan 2012-07-27 23:14:23

+0

thnaks..works但我想我需要做一些更多的因爲輸入字符串是16bytes(32個字符) – user1558886 2012-07-27 23:51:51

回答

0

如果您知道該字符串始終是一個固定長度(如10個字符作爲你的例子),那麼你可以分割字符串分成四個等份每三個字符長(兩位用於數字,一位用於終結符),然後在每個部件上使用strtoul。如果參數少於十個字符,則只填寫相關部分,並保留另一個爲"00"

0

我會首先做的是使用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 
+0

您的輸出是倒退。 OP需要'0x12 0x34 0xaa 0zbb'命令中的字節,但是您將它們存儲在'0xbb 0xaa 0x34 0x12'命令中。 – 2012-07-28 01:08:20

+0

@RemyLebeau:是的,我知道,如果他需要相反的順序('bytes [NUM_BYTES-1-i]'),他可以對代碼進行簡單的修改。 – AusCBloke 2012-07-28 01:22:28

+0

'strtoul()'最多可處理4個字節,'strtoull()'最多8個字節。除此之外的任何事情(他需要多達16個字節)都需要手動解析。 – 2012-07-28 01:48:55

0

嘗試這樣的事情來解析任意長度的輸入:

#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; 
}