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=)