1

Java の場合:

値 = 1122;

public static final byte[] intToByteArray(int value) {
        return new byte[] {
                (byte)(value >>> 24),
                (byte)(value >>> 16),
                (byte)(value >>> 8),
                (byte)value};
    }

  public static int byteArrayToInt(byte[] data) {
        return (int)(
                (int)(0xff & data[0]) << 24  |
                (int)(0xff & data[1]) << 16  |
                (int)(0xff & data[2]) << 8   |
                (int)(0xff & data[3]) << 0
        );
    }

ここでは [0, 0, 4, 98] を返すので、C では:

char* intToByteArray(int value){
        char* temp = new char[4];
         temp[0] = value >> 24,
         temp[1] = value >> 16,
         temp[2] = value >> 8, 
         temp[3] = value;
         return temp;
} 

cにはバイトデータ型がないため、代わりにchar *を使用できますが、一時値を返すとnullになるため、次のような値をチェックしました。ゼロのデータを取得するには、変換中に残りの値をどのように管理すればよいですか??

         char* where = new char[10];
         where[0] = temp[3];
         where[1] = temp[2];
         where[2] = temp[1];
         where[3] = temp[0];
         where[4] = 0;
4

2 に答える 2

3

私はヌルになっています

いいえ、違います。ヌルバイトである最初のバイトを取得してい\0ます。これをテキスト文字列として出力すると、文字列が終了します。しかし、それは文字列ではなく、バイトの配列です。

NULL を取得していた場合、セグメンテーション違反などを取得します。

于 2012-08-06T13:36:55.927 に答える
0

上記の投稿は完全に正しいものですが、移植作業にはもう 1 つ深刻な問題があります。あなたのJavaが生成します

[ 0, 0, 4, 98 ]

あなたのCが生成する間

[ 98, 4, 0, 0 ]

そのように単純に変換すると、コードは機能しません。Java はハードウェアに関係なくビッグ エンディアンですが、当然のことながら C(++) はロー エンディアンです。さらに悪いことに、毎回そのようになるとは限りません。Carbide を使用すると、ビッグ エンディアン アーキテクチャ (一部の ARM? この分野の専門家ではない) に完全に出くわすことができると思います。そのため、Carbide プラットフォームのエンディアンを検出するか、ビットシフトをインクリメンタル モジュロ 256 に置き換える必要があります。関数を呼び出す頻度によって異なります。Modulo は、より多くのプロセッサの労力を真剣に受け止めますが、エンディアンは気にしません。

于 2012-08-06T14:14:41.280 に答える