最近,我看到了关于二进制编码的讨论,给出的示例是以两个字节存储一个Java Date
对象的日期部分(日、月和年)。我现在正试着理解谈话中的代码片段:
long time = new Date().getTime(); // time in ms since epoch
time /= 86400000; // ms in a day
byte a = (byte)(time >>> 8);
byte b = (byte)(time);
现在我忽略的一点是,将这两个字节转换回原来日期的日期、月份和年份显然是“简单”的。我也不知道为什么我们使用两个字节,如果我们保留原来的时间值作为一个字节。
有人能解释一下这怎么可能吗?我理解上面的代码在做什么,只是不知道如何恢复原始日期。
更新
这是我们的演讲,问题是20/21
http://www.slideshare.net/jtdavies/turn-your-xml-into-binary-java-one-2014
发布于 2015-03-13 14:08:47
下面是如何从字节中还原日期:
long time = new Date().getTime(); // time in ms since epoch
time /= 86400000; // ms in a day
byte a = (byte) (time >>> 8);
byte b = (byte) (time);
time = a;
time = time << 8;
time = time | b;
time *= 86400000;
System.out.println(new Date(time));
发布于 2015-03-13 14:11:37
假设您的byte
是8位字节,那么这就提供了一个16位范围或0-65535
。
一个天数可以是1-31
,可以容纳5位。
一个月数可以是1-12
,可以容纳4位。
这使得16-5-4=7
位可以存储年份或范围的0-127
。您可能会假设我们正在讨论2000
,因此您可以轻松地将任何日期打包到一个16位数字中。
int date = ((((y % 100) << 5) + m) << 4) + d;
int year = 2000 + (date >>> (5 + 4));
int month = (date >> 4) & 0x1f;
int day = date & 0xf;
请注意-这是一个花费全世界数十亿美元(据称)的想法。它被称为y2k错误,那时候我们只添加了1900
。
发布于 2015-03-13 14:09:40
如果有两个字节( a
和b
),您可以按照如下方式重构原始时间戳:
public static Date reconstructFromBytes(byte a, byte b) {
long timestampRecovered = (a << 8);
timestampRecovered += b;
timestampRecovered *= 86400000;
return new Date(timestampRecovered);
}
正如一位评论者所说,这假设一天有8640万毫秒。
https://stackoverflow.com/questions/29034085
复制相似问题