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

时间:2015-10-06 11:07:25

标签: java inputstream

我一直在努力让我的计划的一部分工作。经过大约一周的反复试验,我不认为我能在没有任何帮助的情况下做到这一点。

以下是这种情况: 我编写了一个应用程序,它使用套接字从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; 
}

2 个答案:

答案 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