1

とにかくこれを行う方法について何か考えがありますか?

私が持っているとしましょう

char x[] = "ABCD";

そして私はそれをintに入れたいので、

int y = 'ABCD';

個々の文字を入力することしかできません。たとえば、int y = x[0];目的は10進表現を見つけることですが、「A」だけでなく「ABCD」の10進表現が必要です。

最後sprintf(dest, "%.2u", value);に、charの10進表現を取得するために使用します。

編集:

理由はわかりませんが、「ABCD」の場合、このコードは機能します

//unrolled bit ops
const char* x = "ABCD";
uint32_t y = 0;
y |= (uint32_t(x[0]) << 24); //MSB
y |= (uint32_t(x[1]) << 16);
y |= (uint32_t(x[2]) <<  8);
y |= (uint32_t(x[3]) /*<< 0*/);

ただし、インスタンスごとに「(¸þ¶」を使用すると、同じ結果が得られません。

EDIT2 **:

前回の編集サムを試しましたが、それでも機能しません。私が取得している値は、正しい値の「683212470」ではなく、「4294967294」です。私もこれをしました

int h1 = '(';
int h2 = '¸';
int h3 = 'þ';
int h4 = '¶';

出力:

40
-72
-2
-74

完全なASCIIテーブルをグーグルで検索したところ、「þ」の値は「254」であることがわかりました。私はそれがこれと関係があると思います...私もusignedで試しましたが、良い結果はありませんでした。

edit3:(各文字の10進表現で置き換えればconst char *x = "(¸þ¶"int x[] = {40, 184, 254, 182};機能します。どこで問題が発生するかは理解できますが、修正方法がわかりません。

4

2 に答える 2

4

適切なキャストのためにそのchar配列のintアライメントを保証するか、そのintにmemcpyを実行する必要があります。整数のエンディアンにも注意してください!さらに、uint32_tなどのC99整数型を使用すると、コードを移植可能にするのにも役立ちます。

ビットを変換する方法については、この質問を参照してください: 厳密なエイリアシングとアラインメント

編集:

R.マルティニョフェルナンデスが意味することは、これかもしれません(テストされていません):

//unrolled bit ops
const char* x = "ABCD";
uint32_t y = 0;
y |= (uint32_t(uint8_t(x[0])) << 24); //MSB
y |= (uint32_t(uint8_t(x[1])) << 16);
y |= (uint32_t(uint8_t(x[2])) <<  8);
y |= (uint32_t(uint8_t(x[3])) /*<< 0*/);

上記の例では、エンディアンの特定のコードを回避しています

編集2:

動的文字配列の場合(4未満を変換する必要がある場合は先行ゼロ文字を想定):

const char* x = "ABC";
size_t nChars = 3;

assert(0 < nChars && nChars <= sizeof(uint32_t));

uint32_t y = 0;

int shift = (nChars*8)-8;
for(size_t i = 0;i < nChars;++i)
{
    y |= (uint32_t(uint8_t(x[i])) << shift);
    shift -= 8;
}
于 2013-01-21T14:42:16.180 に答える
-1

これが必要な場合は、サンプルプログラムを作成しました。

必要なヘッダー(stdio.h、stdlib.h、math.h、string.h)を含めます

unsigned long convertToInt(char *x);

void main() {

char x[] = "ABCD";
unsigned long y = 0;

y = convertToInt(x);

printf("Numeric value = %lu\n", y);

}

unsigned long convertToInt(char *x) {

unsigned long num = 0, i, n;`
char hex_c;

for(i = 0; i< strlen(x); i++)  {

    hex_c = x[i];

    if (hex_c >= '0' && hex_c <= '9') {
    n = hex_c - '0';
    } else if (hex_c >= 'A' && hex_c <= 'F') {
    n =  10 + hex_c - 'A';
    } else if (hex_c >= 'a' && hex_c <= 'f') {
    n = 10 + hex_c - 'a';
    } else {
        printf("Wrong input");
    return 0;
    }

    num += n * (pow(16, (strlen(x) - i - 1)));
}

return num;

}
于 2013-01-21T15:38:47.853 に答える