19

unsigned int 数値 (2 バイト) があり、それを unsigned char 型に変換したいと考えています。私の検索から、ほとんどの人が次のことを推奨していることがわかります。

 unsigned int x;
 ...
 unsigned char ch = (unsigned char)x;

正しいアプローチですか?unsigned char は 1 バイトであり、2 バイトのデータから 1 バイトにキャストしたためです。

データの損失を防ぐために、unsigned char[] の配列を作成し、個々のバイトを配列に保存したいと考えています。私は次のことで立ち往生しています:

 unsigned char ch[2];
 unsigned int num = 272;

 for(i=0; i<2; i++){
      // how should the individual bytes from num be saved in ch[0] and ch[1] ??
 }

また、unsigned char[2] を unsigned int に戻すにはどうすればよいでしょうか

どうもありがとう。

4

6 に答える 6

23

その場合に使用できますmemcpy

memcpy(ch, (char*)&num, 2); /* although sizeof(int) would be better */

また、unsigned char[2] を unsigned int に戻すにはどうすればよいでしょうか。

同様に、memcpy の引数を逆にするだけです。

于 2012-04-25T16:29:38.317 に答える
15

どうですか:

ch[0] = num & 0xFF;
ch[1] = (num >> 8) & 0xFF;

逆の操作は演習として残します。

于 2012-04-25T16:28:52.433 に答える
7

ユニオンを使ってみてはどうですか?

union {
    unsigned int num;
    unsigned char ch[2];
}  theValue;

theValue.num = 272;
printf("The two bytes: %d and %d\n", theValue.ch[0], theValue.ch[1]);
于 2012-04-25T16:31:21.213 に答える
6

それは本当にあなたの目標に依存します:なぜこれをに変換したいのunsigned charですか? その答えに応じて、これを行うにはいくつかの異なる方法があります。

  • Truncate : これが推奨されたものです。を必要とする関数にデータを絞り込もうとしているだけの場合はunsigned char、キャストするだけですuchar ch = (uchar)x(もちろん、int が大きすぎるとどうなるか注意してください)。

  • 特定のエンディアン: 宛先で特定の形式が必要な場合に使用します。通常、ネットワーク コードはすべて、文字のビッグ エンディアン配列に変換されます。

    int n = sizeof x;
    for(int y=0; n-->0; y++)
        ch[y] = (x>>(n*8))&0xff;
    

    します。

  • マシン エンディアン。これは、エンディアン要件がなく、データが 1 台のマシンでのみ発生する場合に使用します。配列の順序は、アーキテクチャによって異なります。人々は通常、これをunions で処理します:

    union {int x; char ch[sizeof (int)];} u;
    u.x = 0xf00
    //use u.ch 
    

    memcpy:

    uchar ch[sizeof(int)];
    memcpy(&ch, &x, sizeof x);
    

    または、これまでになく危険な単純なキャスト (未定義の動作であり、多数のシステムでクラッシュします):

    char *ch = (unsigned char *)&x;
    
于 2012-04-25T16:54:42.823 に答える
4

もちろん、より大きな値を格納するのに十分な大きさの char の配列は、この値自体とまったく同じ大きさでなければなりません。したがって、この大きな値はすでに文字の配列であると単純に見なすことができます。

unsigned int x = 12345678;//well, it should be just 1234.
unsigned char* pChars;

pChars = (unsigned char*) &x;

pChars[0];//one byte is here
pChars[1];//another byte here

(何が起こっているのかを理解したら、変数なしですべてキャストするだけで実行できます)

于 2012-04-25T16:33:43.803 に答える
3

を使用してこれらのバイトを抽出するだけですbitwise & operatorOxFF1 バイトを抽出する 16 進数のマスクです。ここでさまざまなビット操作を見てください - http://www.catonmat.net/blog/low-level-bit-hacks-you-absolutely-must-know/

プログラムの例は次のとおりです。

#include <stdio.h>

int main()
{
    unsigned int i = 0x1122;
    unsigned char c[2];

    c[0] = i & 0xFF;
    c[1] = (i>>8) & 0xFF;

    printf("c[0] = %x \n", c[0]);
    printf("c[1] = %x \n", c[1]);
    printf("i    = %x \n", i);

    return 0;
}

出力:

$ gcc 1.c 
$ ./a.out 
c[0] = 22 
c[1] = 11 
i    = 1122 
$
于 2012-04-25T16:37:02.967 に答える