如何在java中将三个字节的数据压缩成两个字节

时间:2014-11-25 11:27:28

标签: java.nio.file

我必须将3个字节的数据压缩为两个字节。  3字节数据包括day是一个字节,小时是另一个字节,最后几分钟是另一个字节。所以我总共有3个字节data.how我可以把这个数据翻转成两个字节。

谢谢,

2 个答案:

答案 0 :(得分:0)

  • 分钟范围从0到59,因此数字可以存储在6 位(6位=> 0到63)
  • 小时数从0到23不等 可以存储在5比特(5比特=> 0到31)
  • 天......呃......从0到6?让我们了解一下。 2个字节= 16位,减去11 其他位,所以剩下5位就足够了。

要将3个字节的数据打包成两个,您必须分配这些位: 我会将分钟的位0到5,小时的位6到10以及日期号的剩余位。

所以打包位的公式是:

packed=minutes+hours*64+days*2048

要取回未压缩的数据:

minutes=packed & 63
hours=(packed & 1984) / 64
days=(packed & 63488) / 2048

答案 1 :(得分:0)

我假设您需要从1-31开始的一天,从0到39的小时和从0到59的分钟,因此您需要每天5位,小时5位和分钟6位。这恰好是16位。你应该把5位(天)和前3位小时放入你的第一个字节,其余2位用于小时,6位用于分钟到第二个字节:

 int day = 23;
 int hour = 15;
 int minute = 34;
 byte fromint_dh = (day << 3) | (hour >> 2);
 byte fromint_hm = ((hour & 0x03) << 6) | (minute); // take the last two bits from hour and put them at the beginning

 ....
 int d = fromint_dh >> 3;
 int h = ((fromint_dh & 0x07) << 2) | ((fromint_hm & 0xc0) >> 6); // take the last 3 bits of the fst byte and the fst 2 bits of the snd byte
 int m = fromint_hm & 0x3F // only take the last 6 bits

希望这会有所帮助。这很容易弄错......