0

重複の可能性:
intをchar配列に格納しますか?

4つの8ビットunsignedcharを32ビット整数にロードしたい。そして、32ビット整数をunsignedcharポインタに格納します。これはどのように可能ですか?以下の使用例;

int 32bitint1= 0xff000000 | (uchar1<<16) | (uchar2<<8) | uchar3;
int 32bitint2= 0xff000000 | (uchar4<<16) | (uchar5<<8) | uchar6;
//then this 32-bit integer to uchar pointer;
ucharpointer[0] = 32bitint1;
ucharpointer[4] = 32bitint2;//is this possible?or how
4

2 に答える 2

1

ストア:(4文字をunsignedintにストアします)

int store(uint32_t * reg, unsigned char c[4])
{
    *reg = 0;
        for(int i=0;i<4;i++)
        {
            *reg = (*reg<<8) | c[i];
        }
        return 0;
}

ロード:(unsignedintから4文字をロードします)

int load(uint32_t * reg, unsigned char c[4])
{
        for(int i=0;i<4;i++)
        {
            c[i] = *reg;
            *reg = *reg>>8;
        }
        return 0;
}

使用例

int main ()
{
    unsigned char c[4] = {'a','b','c','d'};
    uint32_t reg;

    printf("%c",c[0]);  //it prints 'a'
    store(&reg,c);   

    c[0] = 'e';
    printf("%c",c[0]);  //it prints 'e'

    load(&reg,c);     //load
    printf("%c",c[0]);  //it prints 'a' again

    return 0;
}

それらをchar配列にリロードしたくないが、charポインターでそれらにアクセスしたい場合は、次に例を示します。

int main (int argc, char const *argv[])
{
    unsigned char c[4] = {'a','b','c','d'};
    uint32_t reg;
    store(&reg,c);

    unsigned char *cpointer = (unsigned char *) &reg;

    for(int i=0;i<4;i++)
    {
        printf("%c",cpointer[i]);  //access the 4 chars by a char pointer
    }
    return 0;
}

メモリアドレスは逆の順序で作成されるため、この方法で出力「dcba」が得られることに注意してください。

于 2012-12-18T10:41:32.893 に答える
0

バイトがビッグエンディアンで読み取られると仮定して、32バイトを形成する各4バイトを次のように格納します。

uint32_t bit_32 = ((uint32_t)uchar[0] << 24) |  ((uint32_t)uchar[1] << 16) | ((uint32_t)uchar[2] << 8) | ((uint32_t)uchar[3])

32ビット整数をunsignedcharポインタに次のように格納します。

unsigned char *ptr = &bit_32;
于 2012-12-18T10:28:16.590 に答える