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