Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将InputStream.read()转换为数字(非整数)_Java_Inputstream - Fatal编程技术网

Java 将InputStream.read()转换为数字(非整数)

Java 将InputStream.read()转换为数字(非整数),java,inputstream,Java,Inputstream,我一直在努力让我的程序的一部分工作。经过大约一周的反复试验,我认为没有任何帮助我无法做到这一点 情况是这样的: 我编写了一个应用程序,它使用套接字通过TCP从设备读取数据。设备发送的所有数据都表示为字节,而不是字符串。每当我在InputStream上搜索时,我得到的都是“如何将InputStream转换为字符串” 目前,我能够将数据从InputStream读取到ArrayList中。然而,这些是整数,而不是小数 下面是一个由设备发送的(UNIX)时间戳的示例,读取整数: 0 0 1 80 59

我一直在努力让我的程序的一部分工作。经过大约一周的反复试验,我认为没有任何帮助我无法做到这一点

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

目前,我能够将数据从
InputStream
读取到
ArrayList
中。然而,这些是整数,而不是小数

下面是一个由设备发送的(UNIX)
时间戳的示例,读取整数:

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

我在这里做了很多尝试,但尚未成功地将这些转换为正确的UNIX时间戳。它应该翻译成1444109725(即2015年6月10日凌晨5:35(UTC))

有人能帮我吗?提前谢谢

--编辑--

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

public long bytesToLong(int[] bytes) { 
long v = 0 ; 
for (int i : bytes) { 
v = (v << 8) | i; 
} return v; 
}
public long bytestolog(int[]字节){
长v=0;
对于(int i:bytes){
v=(v
应翻译为1444109725

嗯,我怀疑它实际上应该被转换为1444109725760,这是当读取为big-endian 64位整数时字节所表示的。然后将其视为自Unix纪元以来的毫秒(而不是秒)


幸运的是,这样做很简单:使用
DataInputStream
,调用
readLong
。如果这是小尾端,则会稍微复杂一些……但是如果您的格式基本上是大尾端,您应该尽可能多地使用
DataInputStream
。这将使您的生活更加简单。

同意前面的answ呃,使用
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);
    }
}
包片段;
公共类FindLong{
公共静态void main(字符串[]args){
int[]字节=新的int[]{0,0,1,80,59,165,176,64};
长v=0;
for(int i:字节){

v=(v您能告诉我们您到目前为止尝试了什么吗?以字节的形式读取数字,并相应地组合long(位移位运算符)。这是9个字节…似乎不可能都是Unix时间戳。感谢您的快速回复!我已经尝试了太多,可能做得不对。我尝试将值转换为十六进制(哪个有效),但我无法将它们转换为正确的小数来组合时间戳。@Thomas,你能给我一个简单的转换示例吗?你是对的,我在手动转换中去掉了最后3位数字,因为它们没有在时间戳转换器中使用。我将尝试摆弄DataInputStream和readLong,并发布任何数据结果here@Someone:你不需要摆弄它-你构建一个
DataInputStream
包装你的
InputStream
,调用
readLong
,你会得到1444109725760。如果你需要的话,你可以除以1000。我认为这只在数据是时间戳(或任何其他长数据)时有效对我来说,除了时间戳(这只是一个例子)之外,还有更多的负载。使用@KDM的答案,我已经能够创建一个方法,它可以接受流的一小部分(以字节为单位)然后把它翻译成大多数情况下都需要的长码。@Someone:嗯,
readLong
用8个字节做这个,是的。然后还有
readInt
用4个字节,还有
readShort
用2个字节。如果你在网络协议中发现其他长度,而不是在非常特殊的情况下,我会感到惊讶。这对你有很大帮助,我已经创建了一个ted一个简单的方法,使用你的代码现在显示正确的时间戳!
public long bytesToLong(int[]字节){long v=0;for(int i:bytes){v=(v=)