4

32ビットのunsignedintに格納されている値を取得し、それを4つの文字に入れてから、これらの各文字の整数値を文字列に格納したいと思います。

最初の部分は次のようになると思います。

char a = orig << 8;
char b = orig << 8;
char c = orig << 8;
char d = orig << 8;
4

5 に答える 5

10

「orig」が値を含む32ビット変数であるとしましょう。

私はあなたがこのようなことをしたいと思っていると思います:

unsigned char byte1=orig&0xff;
unsigned char byte2=(orig>>8)&0xff;
unsigned char byte3=(orig>>16)&0xff;
unsigned char byte4=(orig>>24)&0xff;

char myString[256];
sprintf(myString,"%x %x %x %x",byte1,byte2,byte3,byte4);

ちなみに、これが常にエンディアンが正しいかどうかはわかりません。(編集:ビットシフト操作はエンディアンの影響を受けないため、確かにエンディアンは正しいです)

お役に立てれば。

于 2008-10-07T18:09:09.657 に答える
10

最初に個々のバイトを本当に抽出したい場合:

unsigned char a = orig & 0xff;
unsigned char b = (orig >> 8) & 0xff;
unsigned char c = (orig >> 16) & 0xff;
unsigned char d = (orig >> 24) & 0xff;

または:

unsigned char *chars = (unsigned char *)(&orig);
unsigned char a = chars[0];
unsigned char b = chars[1];
unsigned char c = chars[2];
unsigned char d = chars[3];

または、unsigned long と 4 文字の結合を使用します。

union charSplitter {
    struct {
        unsigned char a, b, c, d;
    } charValues;

    unsigned int intValue;
};

charSplitter splitter;
splitter.intValue = orig;
// splitter.charValues.a will give you first byte etc.

更新: friol が指摘したように、ソリューション 2 と 3 はエンディアンに依存しません。abcおよび を表すバイトはd、CPU アーキテクチャによって異なります。

于 2008-10-07T18:12:14.767 に答える
4

を使用しunionます。(ここで要求されているのはサンプルプログラムです。)

    #include <<iostream>>
    #include <<stdio.h>>
    using namespace std;

    union myunion
    {
       struct chars 
       { 
          unsigned char d, c, b, a;
       } mychars;

        unsigned int myint; 
    };

    int main(void) 
    {
        myunion u;

        u.myint = 0x41424344;

        cout << "a = " << u.mychars.a << endl;
        cout << "b = " << u.mychars.b << endl;
        cout << "c = " << u.mychars.c << endl;
        cout << "d = " << u.mychars.d << endl;
    }

Jamesが述べたように、これはプラットフォーム固有です。

于 2008-10-07T18:08:06.397 に答える
1

完全ではありません:

char a = orig & 0xff;
orig >>= 8;
char b = orig & 0xff;
orig >>= 8;
char c = orig & 0xff;
orig >>= 8;
char d = orig & 0xff;

「これらの各値の整数値を文字列に格納する」とはどういう意味か正確にはわかりません。に変換しますか、それとも何に0x10111213変換します"16 17 18 19"か?

于 2008-10-07T18:05:39.663 に答える
0

16進数の場合:

sprintf(buffer, "%lX", orig);

10進数の場合:

sprintf(buffer, "%ld", orig);

snprintfバッファオーバーフローを回避するために使用します。

于 2008-10-07T18:07:20.923 に答える