私はこのようなcharバッファを持っています
char *buff = "aaaa0006france";
4〜7バイトを抽出してintに格納したいと思います。
int i;
memcpy(&i, buff+4, 4);
printf("%d ", i);
ただし、ジャンク値を出力します。
これの何が問題になっていますか?
文字列
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
テキスト文字列を数値に変換する関数を使用して、テキストを明示的に整数に変換します。
お役に立てれば!
ここでは、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の後の値は次のようになりますa
b
memcpy
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
。
以下のコードはあなたを助けるかもしれません...
#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;
}