2

私はこの番号を16進文字列で持っています:

002A05.

この数値の7番目のビットを1に設定する必要があるので、変換後に次のようになります。

022A05

ただし、6文字の16進数ごとに機能する必要があります。

strtolを使用して16進文字列を整数に変換しようとしましたが、その関数は先行ゼロを削除します。

どうすれば解決できるか教えてください。

4

4 に答える 4

3
int hex=0x002A05;
int mask = 0x020000;
printf ("%06X",hex | mask);

お役に立てれば

于 2012-11-17T11:29:40.213 に答える
2

24ビットの数値では、ビット#7(例で行ったように、従来のように右からではなく、左から数えます)は、常に左から2番目のバイトになります。数値全体を整数に変換せずに、その2番目の16進数を取得し、それを0..15の数値に変換し、そのビット#3を設定して(再び左から数えて)、結果を16進数に戻すことで問題を解決できます。桁。

int fromHex(char c) {
    c = toupper(c);
    if (c >= '0' && c <= '9') {
        return c-'0';
    } else {
        return c-'A'+10;
    }
}
char toHexDigit(int n) {
    return n < 10 ? '0'+n : 'A'+n-10;
}

char myNum[] = "002A05";
myNum[1] = toHexDigit(fromHex(myNum[1]) | 2);
printf("%s\n", myNum);

これは「022A05」(ideoneへのリンク)を出力します。

于 2012-11-17T11:32:34.630 に答える
1

16進定数ではなく、操作したい文字列があるように思えます。16進文字のASCII値を少しいじることで、非常に簡単に行うことができます。char h = '6';、、、、などの16進文字を表すcharがある場合はchar h = 'C';、以下char h = '';を使用して、文字が表す数値の左から3番目(右から2番目)のビットを設定できます。

 h = h > '7' ? h <= '9' ? h + 9 : ((h + 1) | 2) - 1 : h | 2;

したがって、文字列の2番目の文字(4 + 3ビット)に対してこれを行うことができます。これは、2文字以上の任意の16進文字列で機能します。これがあなたの例です:

char hex_string[] = "002A05";

// Get the second character from the string
char h = hex_string[1];

// Calculate the new character
h = h > '7' ? h <= '9' ? h + 9 : ((h + 1) | 2) - 1 : h | 2;

// Set the second character in the string to the result
hex_string[1] = h;

printf("%s", hex_string); // 022A05
于 2012-11-17T11:35:58.913 に答える
0

あなたはstrtol具体的に質問したので、あなたの質問に答えるには、数値を次のように変換した後にパディングを追加するだけですstrtol

const char *s = "002A05";
int x = strtol(s, NULL, 16);
x |= (1<<17);
printf("%.6X\n",x);
于 2012-11-17T11:35:21.750 に答える