繁体   English   中英

将InputStream.read()转换为数字(不是整数)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM