我一直在努力让我的计划的一部分工作。经过大约一周的反复试验,我不认为我能在没有任何帮助的情况下做到这一点。
以下是这种情况:
我编写了一个应用程序,它使用套接字从TCP
以上的设备读取数据。设备发送的所有数据都表示为字节,而不是字符串。每当我在InputStream
上谷歌时,我得到的就是#34;如何将InputStream
转换为String"。
目前,我可以将InputStream
的数据读入ArrayList<Integer>
。但是,这些是整数,而不是小数。
以下是设备发送的(UNIX)TimeStamp
示例,以整数读取:
0 0 1 80 59 165 176 64(已编辑,复制1个字节太多)
我在这里尝试了很多,但还没有成功将这些转换为正确的UNIX时间戳。它应该被翻译为 1444109725(2015年6月10日上午5:35(UTC))。
任何可以帮助我的人?提前谢谢!
- 编辑 -
感谢下面的所有答案,我已经能够创建一个有效的解析器&#39;对于传入的数据。我所要做的就是将字节/整数转换为Long值。由于我的输入数据由多个不同长度的值组成,因此无法将其全部读取为Long,因此我必须迭代te数据,例如获取时间戳的8个字节/整数并使用此方法创建一个可读的unix时间戳:
public long bytesToLong(int[] bytes) {
long v = 0 ;
for (int i : bytes) {
v = (v << 8) | i;
} return v;
}
答案 0 :(得分:2)
应该翻译成1444109725
好吧,我怀疑实际应该转换为1444109725760,这是读取为big-endian 64位整数时字节所代表的含义。然后,自Unix时代(而不是秒)开始,将其视为毫秒。
幸运的是,这很简单:使用DataInputStream
,然后致电readLong
。如果这是小端的话会稍微复杂一些......但是如果你的格式基本上是大端的话,你应该尽可能多地使用DataInputStream
...它会让你的生活多得多简单。
答案 1 :(得分:0)
同意上一个答案,使用DataInputStream
是最好的方法。如果你想手工获取价值:
package snippet;
public class FindLong {
public static void main(String[] args) {
int[] bytes = new int[] { 0, 0, 1, 80, 59, 165, 176, 64 } ;
long v = 0 ;
for (int i : bytes) {
v = (v << 8) | i;
}
System.out.println(v);
}
}
打印1444109725760
。