0

生年月日 (3 つの整数) をバイトに変換して元に戻そうとしていますが、問題が発生しています。ビット操作を使用して変換し、マルチキャスト サーバー経由でデータを送信して受信し、int に戻す必要があります。サーバーは正常に動作しますが、ビット操作は私には難しいです。コードの問題は何ですか:

変換:

      int D=12; 
      int M=9; 
      int Y=1983;
      short DMY=0; 
      DMY = (short)(DMY | (D << 19));
      DMY = (short)(DMY | (M << 15));
      DMY = (short)(DMY | Y); 
      byte[] data = new byte[3];
      data[0] = (byte)(DMY >>> 8 );
      data[1] = (byte)(DMY >>> 16 );
      data[2] = (byte)(DMY & 0xffff);

元に戻す:

           byte[] rec_data = new byte[3];
           rec_data = dp.getData();
           short Rec_dmy;


           Rec_dmy = (short)(rec_data[0] & 0xff);
           Rec_dmy = (short) (Rec_dmy << 8);
           Rec_dmy = (short)(Rec_dmy | (rec_data[1] & 0xff));
           Rec_dmy = (short) (Rec_dmy << 8);
           Rec_dmy = (short)(Rec_dmy | (rec_data[2] & 0xffff));

           byte tmp = (byte) ((Rec_dmy  >>> 19) & 0x1F);
           byte tmp2 = (byte) ((Rec_dmy >>> 15) & 0x1FF);
           byte tmp3 = (byte) (Rec_dmy & 0x7F);       

            System.out.println(tmp);
            System.out.println(tmp2);
            System.out.println(tmp3);

Println は次の答えを返します: 31 -1 63

1983 年 9 月 12 日、オリジナルに近くありません

4

3 に答える 3

3

Short は 16 ビットしか保持できません。それ以上のパックをしようとしています (たとえば、日を 19 だけ左にシフトすると、ショートにキャストされるとすべてゼロの値になります)。すべてのフィールドを保持するには、int または long を使用する必要があります。

確かに、正しくないビット操作でいくつかのことが起こっています。

私の提案は、ビット操作を捨てて、日、月、年を別々のフィールドとして送信することです。日と月のそれぞれに 1 バイト、年に 2 (短い) です。これには 4 バイト (余分な 1 バイトのみ) が必要ですが、正しく処理するために必要な操作ははるかに少なくなります。

于 2012-08-25T05:26:25.343 に答える
1

簡単ではありませんが、操作が a) 情報を失う b) エンコードした方法の逆をデコードしないように体系的に作業する必要があります。

int D = 12;
int M = 9;
int Y = 1983;
int DMY = (D << 19) | (M << 15) | Y;
byte[] data = new byte[3];
data[0] = (byte) (DMY >>> 16);
data[1] = (byte) (DMY >>> 8);
data[2] = (byte) DMY;

int DMY2 = ((data[0]&0xFF) << 16) | ((data[1]&0xFF) << 8) | (data[2]&0xFF);
int D2 = DMY2 >>> 19;          // no mask required
int M2 = (DMY2 >>> 15) & 0x0F; // 4 bits mask
int Y2 = DMY2 & 0x7FFF;        // 15 bit mask
System.out.println(D2 + "/" + M2 + "/" + Y2);

版画

12/9/1983
于 2012-08-25T07:15:16.890 に答える
0

まず、年を最大値 9999 で表すには、少なくとも 14 ビットが必要です2^14 > 9999 && 2 ^ 13 < 9999。また、月の最小ビット数は 4 (最大 12)、日は 5 (最大 31) です。そのため、short int(16 ビット) を使用して年とバイト (8 ビット) を日と月ごとに表すことができます。したがって、32 ビットの int を取得します。

public int encoded(short year, byte month, byte day){
    int data =0;
    data = year & 0xFFFF;
    data =(data << 8)|(month & 0xFF)
    data =(data << 8)|(day & 0xFF)
    return data;
}

public void decode(int data){
    int day = data & 0xFF;
    int month = (data >> 8) & 0xFF;
    int year = (data >> 16) & 0xFFFF;
}
于 2012-08-25T05:40:54.377 に答える