簡體   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