0

コマンドライン引数からの入力が の形式である C プログラムを作成しようとしています0x1234aabb

これは間違いなく char としてプログラムに含まれ*[]ます。

ここで、この入力を の形式で保存したいと思いますchar a[]={0x12, 0x34, 0xaa, 0xbb}

助けてください。

4

3 に答える 3

0

私が最初に行うことはstrtoul、16(16進数)の基数引数を使用して文字列を整数として解析することです。unsigned longは少なくとも32ビットのサイズであることが保証されているため、すべての数値が8桁の16進数(4バイト)である場合は、適切なタイプである必要があります。

数値を取得したら、ビットシフトとビット単位のANDを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
于 2012-07-27T23:29:44.033 に答える
0

文字列が常に固定長であることがわかっている場合 (たとえば、例のように 10 文字)、文字列を 3 文字ごとに 4 つの等しい部分 (数字用に 2 つ、ターミネータ用に 1 つ) に分割し、strtoulonを使用できます。各部。引数が 10 文字未満の場合は、関連する部分のみを記入し、残りはそのままにして"00"ください。

于 2012-07-28T00:39:27.920 に答える
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;
}
于 2012-07-28T01:46:12.103 に答える