2014-11-25 188 views
0

我必须将3个字节的数据压缩到两个字节。 3字节数据包括日期在一个字节中,小时在另一个字节中,最后分钟在另一个字节中,所以我有3个字节的数据。我可以只将这些数据翻转成两个字节。如何在java中将三个字节数据压缩成两个字节

谢谢,

+0

请发布您迄今为止的代码。 – 2014-11-25 11:35:29

回答

0
  • 分钟的范围从0到59,以便数可以存储在6 位(6位=> 0至63)
  • 时间是从0到23的数 可以存储在5位(5位=> 0到31)
  • 天...错误...从0到6?让我们来看看这个。 2个字节= 16位,减去其他位,所以你剩下5位,这已经足够了。

收拾你3个字节的数据分为二,你要派位:6 我会0位设置到5分钟,位至10小时,和位离开的一天数。

所以收拾位的计算公式为:

packed=minutes+hours*64+days*2048 

要拿回你的未压缩数据:

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

感谢您的快速回复。但我有十六进制数据,所以我需要使用字节缓冲区将其转换为字节,然后必须应用翻转 – user3518959 2014-11-25 11:53:03

0

我假设你需要从1-31日,小时从0-23和从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 

希望这有助于。很容易弄错位...

+0

嗨,罗尔夫,让我清楚地解释我的问题。 – user3518959 2014-11-25 12:19:10

+0

我有一个int day = Calender.DAY_OF_MONTH; Calendar.HOUR_OF_DAY; Calendar.MINUTE;我已经使用Integer.toHexString()方法将它们转换为十六进制。 – user3518959 2014-11-25 12:20:59

+0

现在我有十六进制字符串。然后我给这个十六进制字符串ByteBuffer并获取字节。现在我得到3个字节,而不是我只打包两个字节。我希望我清楚吗? – user3518959 2014-11-25 12:22:35