[英]Converting InputStream.read() to numbers (not integers)
我一直在努力让我的程序起作用。 经过大约一周的反复试验,我认为没有任何帮助我就无法做到这一点。
就是这种情况:我编写了一个应用程序,该应用程序使用Socket通过TCP
从设备读取数据。 设备发送的所有数据均以字节表示,而不是字符串。 每当我在InputStream
Google搜索时,我得到的就是“如何将InputStream
转换为String”。
目前,我能够将数据从InputStream
读取到ArrayList<Integer>
。 但是,这些是整数,而不是小数。
这是设备发送的(UNIX) TimeStamp
的示例,以整数读取:
0 0 1 80 59 165176 64(已编辑,已复制1个字节太多)
我在这里做了很多尝试,但尚未成功将它们转换为正确的UNIX时间戳。 应该将其翻译为1444109725(即2015年10月6日上午5:35(UTC)) 。
有人可以帮助我吗? 提前致谢!
-编辑-
由于以下所有答案,我已经能够为传入的数据创建一个有效的“解析器”。 我要做的就是将字节/整数转换为Long值。 由于我的传入数据包含多个具有不同长度的值,因此无法全部读取为Long,因此我不得不遍历te数据,例如获取8个字节/整数的时间戳,并使用此方法创建可读的unix时间戳记:
public long bytesToLong(int[] bytes) {
long v = 0 ;
for (int i : bytes) {
v = (v << 8) | i;
} return v;
}
它应该被翻译为1444109725
好吧,我怀疑它实际上应该转换为1444109725760,当将其读取为大端64位整数时,字节表示什么。 然后,将其视为自Unix纪元以来的毫秒数 (而不是秒数)。
幸运的是,这很简单:使用DataInputStream
,并调用readLong
。 如果这是小尾数的话,会有些棘手...但是,如果您的格式基本上是大尾数的,则应该使用DataInputStream
进行尽可能多的事情……这会使您的生活变得更加简单。
同意上一个答案,使用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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.