2015-10-06 52 views
0

我一直在努力让程序的一部分工作。经过大约一周的反复试验,我觉得没有任何帮助我能够做到这一点。将InputStream.read()转换为数字(非整数)

以下是这种情况: 我已经编写了一个应用程序,它使用套接字通过TCP从设备读取数据。设备发送的所有数据都以字节表示,而不是字符串。每当我谷歌InputStream,我得到的是“如何将InputStream转换为字符串”。

目前我可以将InputStream中的数据读入ArrayList<Integer>。但是,这些是整数,而不是小数。

下面是由所述设备发送的(UNIX)的一个例子TimeStamp,读入的整数:

0 0 1 80 59 165 176 64(编辑,复制1个字节太多)

我已经在这里尝试了很多,并且还没有成功将这些转换为正确的UNIX时间戳。它应该被翻译成1444109725(这是2015年6月10日@ 5:35(UTC))

任何能帮助我的人?提前致谢!

- 编辑 -

感谢所有的答案下面我已经能够创建用于进入数据工作“解析器”。我所要做的就是将字节/整数转换为长整型值。由于我的传入数据由多个不同长度的值组成,因此无法将其全部读取为Long,因此我必须迭代te数据,例如获取时间戳的8个字节/整数,并使用此方法创建可读的unix时间戳:

public long bytesToLong(int[] bytes) { 
long v = 0 ; 
for (int i : bytes) { 
v = (v << 8) | i; 
} return v; 
} 
+0

你能告诉我们你到目前为止试过的东西吗? – consuela

+0

以字节读取数字并相应地组合长(位移运算符)。 – Thomas

+0

这就是* 9 *字节......这似乎不太可能是Unix时间戳。 –

回答

2

应该翻译为1444109725

好吧,我怀疑它应该实际上被翻译为1444109725760,这是当一个大端读取的字节代表什么64位整数。从Unix纪元(而不是秒)开始,您将其视为毫秒

幸运的是,这是微不足道的:使用DataInputStream,并致电readLong。如果这是小端的话,这将会稍微复杂......但如果你的格式基本上是大端的,你应该尽可能地使用DataInputStream ......它会让你的生活变得更简单。

+0

你是对的,我已经剥离了手动转换中的最后3位数字,因为它们没有在时间戳转换器中使用。我会尝试使用DataInputStream和readLong来操作,并在这里发布任何结果 – Someone

+0

@Someone:你不需要摆弄它 - 你构建一个包装你的InputStream的'DataInputStream',调用'readLong',你将会得到1444109725760.如果需要的话,你可以除以1000。 –

+0

我认为这只适用于数据是时间戳(或任何其他长)。对我来说,除了时间戳之外还有更多的负载(这只是一个例子)。使用@KDM的答案,我已经能够创建一个方法,它可以接受一小部分流(以字节为单位),并将其转换为大多数情况下需要的Long。 – Someone

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

+0

我会试试这个,然后回到这里,谢谢! – Someone

+0

这帮助了很多,我用你的代码创建了一个简单的方法,它现在显示了正确的时间戳! 'public long bytesToLong(int [] bytes){0} {0} {0}长v = 0;对于(int i:bytes){ v =(v << 8)|一世; } return v; }' – Someone