1

私はこのようなcharバッファを持っています

char *buff = "aaaa0006france";

4〜7バイトを抽出してintに格納したいと思います。

int i;
memcpy(&i, buff+4, 4);
printf("%d ", i);

ただし、ジャンク値を出力します。

これの何が問題になっていますか?

4

3 に答える 3

5

文字列

0006

整数6と同じ2進表現はありません。代わりに、そのビット表現は、グリフ0、グリフ0、グリフ0、グリフ6を表す4つのASCII文字です。これは16進表現です。

0x30303036

リトルエンディアンシステムでこれらのビットを数値として盲目的に再解釈しようとすると、808,464,438が返されます。ビッグエンディアンシステムでは、909,127,728を取得します。

文字列の部分文字列を数値に変換する場合は、代わりに、テキストの文字列を数値に変換する関数を探す必要があります。次のようなものを試してみてください。

char digits[5];

/* Copy over the digits in question. */
memcpy(digits, buff + 4, 4);
digits[4] = '\0';  /* Make sure it's null-terminated! */

/* Convert the string to a number. */
int i = strtol(digits + 4, NULL, 10);

これは、strtolテキスト文字列を数値に変換する関数を使用して、テキストを明示的に整数に変換します。

お役に立てれば!

于 2013-01-23T05:38:31.403 に答える
2

ここでは、2つのことを書き留める必要があります

  • 文字の保存方法
  • システムのエンディアン

各文字(アルファベット、数字、または特殊文字)は、7ビットのASCII値として格納されます。文字列(文字の配列)「0006」を4バイトmemcpyのint変数に変換する場合、次のように、送信元として文字列のアドレスを指定し、宛先としてintのアドレスを指定する必要があります。

char a[] = "0006";
int b = 0, c = 6;
memcpy(&b, a, 4);

aとbの値は以下のように保存されます。

a 00110110 00110000 00110000 00110000
b 00000000 00000000 00000000 00000000
c 00000000 00000000 00000000 00000110
  MSB                             LSB

文字のASCII値0は48で、6文字は54であるためです。ここで、にmemcpy存在する値をコピーしようとします。bの後の値は次のようになりますabmemcpy

a 00110110 00110000 00110000 00110000
b 00110110 00110000 00110000 00110000
c 00000000 00000000 00000000 00000110
  MSB                             LSB

次はエンディアンです。ここで、値0006を他の方法で保持していると考えてa[0] = 0; a[1] = 0; a[2]=0; a[3] = 6;ください。そうすると、リトルエンディアンのマシンの場合memcpy、値は6ではなく100663296( )になります。0x6000000ビッグエンディアンマシンでは、値はとして6のみ取得されます。

c 00000110 00000000 00000000 00000000
b 00000110 00000000 00000000 00000000
c 00000000 00000000 00000000 00000110
  MSB                             LSB

したがって、数値チャーターを整数値に変換する関数を作成する際に考慮する必要があるこれら2つの問題。これらの問題の簡単な解決策は、既存のシステムAPIを利用することですatoi

于 2013-01-23T11:11:38.937 に答える
1

以下のコードはあなたを助けるかもしれません...

#include <stdio.h>

int main()
{
char *buff = "aaaa0006france";
char digits[5];

memcpy(digits, buff + 4, 4);
digits[4] = '\0';

int a = atoi(digits);
printf("int : %d", a);

return 0;
}
于 2013-01-23T05:52:17.647 に答える