簡體   English   中英

Java 中的 byte[] 到 String:output 是什么意思?

[英]byte[] to String in Java: What does the output mean?

因此,我在嘗試使讀卡器在多功能打印機上正常工作時遇到了一些麻煩,並且我將問題范圍縮小到當 byte[] 作為構造函數參數傳遞時字符串輸出的奇怪值。 我無法通過 MFP 真正調試應用程序,而且日志工具根本無法與讀卡應用程序一起工作(這就是你們的嵌入式編程世界,伙計們,),所以我的工作調試工作幾乎基於打印有時,屏幕上的值。 不完全按照您的意願行事。

好的,這里我們 go:當我在讀卡器上“刷”卡時,我的 Java 程序收到一個字節 []。 現在,我可以通過兩種方式顯示它:

    //Supposing that bytes is the byte[] received
    BigInteger bi = new BigInteger(bytes); bi.toString(16); //I think it works fine
    String str = new String(bytes); //Suggested by the developer; sucks

好的。 第一個輸出“3538353536”。 十六進制值有點奇怪,但它實際上是正確的值; 因為我進行了測試:

    byte[] bytes = {0x35, 0x38, 0x35, 0x35, 0x36};
    BigInteger bi = new BigInteger(bytes);
    System.out.println(bi.toString(16));

考慮到它返回相同的值(3538353536),我將其作為實際的 byte[] 值。 現在,當我嘗試第二種方式時:

    new String(bytes);

在這種情況下,我的返回值是 58556。更糟糕的是,事情並不是每次都那么開心,就像作為參數傳遞一樣

    {(byte)9F, (byte)0xA8, (byte)0xEE};

將 output [選項卡 - 真正的選項卡,而不是寫選項卡] ¨î

我在一些地方讀到新字符串(字節)是 go 的正確方法,更重要的是它是讀卡器開發人員的示例。 但它不起作用。 在我向 go 詢問開發人員之前,我想知道這個 output 與 bi.toString(16) 相比意味着什么,這似乎是 Z34D1F91FB2E514B8576FAB1A75A89 的正確方法。

很抱歉,關於一個可以總結為兩行的問題的相當長的帖子,但我想讓一切都變得清晰,以便直接、快速地回答。

編輯:感謝大家的輸入,我明白了。 現在我很困惑是否應該考慮 ASCII 值(58556)或十六進制(“0x3538353536”)——也就是說,如果它實際上應該被解釋為十六進制——但這是我將向開發人員提出的問題。

正如 javadocs 所說, String(bytes) “通過使用平台的默認字符集解碼指定的字節數組來構造一個新的字符串”。

所以發生的事情是將數據解釋為以字節格式存儲的字符。 如果您查看 ASCII 圖表,您會看到 0x35 = '5' 等。

另一方面,如您所料,ToString 將數據轉換為字符串表示形式。

轉換為十進制數時,您的原始字節數組{0x35, 0x38, 0x35, 0x35, 0x36}為: {53, 56, 53, 53, 54}如果使用 ASCII 值轉換將變為{'5', '8', '5', '5', '6'}因此您使用平台的默認字符集獲取字符串58556

BigInteger 構造函數String 構造函數不同。 根據 Javadoc:

public BigInteger(byte[] val)

將包含 BigInteger 的二進制補碼表示的字節數組轉換為 BigInteger。 輸入數組被假定為大端字節序:最高有效字節在第零個元素中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM