Java 位操作错误(转换为字节并转换回来)

标签 java bit operations

我正在尝试将出生日期(三个整数)转换为字节并将其转换回来,但我遇到了问题。我必须使用位操作对其进行转换,并通过多播服务器发送数据并接收它并改回 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 年 12 月 9 日不符

最佳答案

Short 只能容纳 16 位;您正尝试打包更多内容(例如,将日期左移 19,一旦转换为空,将导致全零值)。您需要使用 int 或 long 来保存所有字段。

确实,位操作中发生了一些不正确的事情。

我的建议是放弃位操作,只将日、月和年作为单独的字段发送:每个日和月一个字节,两个(短字节)代表年。这需要 4 个字节(仅额外一个字节),但需要少得多的调整才能得到正确的结果。

关于Java 位操作错误(转换为字节并转换回来),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12119396/

相关文章:

java - 无法使用 Intent 获取传递的值

Java 8 流矩阵乘法比 For 循环慢 10 倍?

sqlite - 不同表的列之间的SQLite算术

drupal - 不允许用户删除节点,但允许通过 View 批量操作删除

java - Java 中的搜索引擎?

java - Tomcat 应用程序不会通过 OSX 上的 intellij 进入调试

c - 如何将 char 大小的二进制有符号数扩展为有符号 int 大小

c - 反转 32 位 unsigned int 位数字

c - 为什么结构成员似乎有一个溢出值?

r - R填充向量