簡體   English   中英

Java中的等效GetBytes函數,例如c#

[英]Equivalent GetBytes function in Java like c#

將C#庫移植到Java中時,我在將字符串轉換為字節時遇到問題。 它轉換字符串,但不是相同的字節數組。

我在C#中使用此代碼

string input = "Test ěščřžýáíé 1234";
Encoding encoding = Encoding.UTF8;
byte[] data = encoding.GetBytes(input);

和Java代碼

String input = "Test ěščřžýáíé 1234";
String encoding = "UTF8";
byte[] data = input.getBytes(encoding);

第一種是Java輸出,右一種是C#如何使Java輸出與C#相同?

在此處輸入圖片說明

字節數組可能是相同的。 但是,如果將它們格式化為字符串表示形式(例如,通過調試器查看),則它們會出現不同的情況,因為在C#中byte數據類型被視為未簽名(具有值0255 ),但是在Java中已簽名(值-128127 )。 請參閱此問題我的答案以獲取解釋。

編輯 :基於此答案 ,您可以使用以下命令在Java中打印無符號值:

byte b = -60;
System.out.println((short)(b & 0xFF));   // output: 196

這些數組很可能是相同的。

您會被C#和Java之間的巨大差異所折服:在Java中, byteunsigned

為了轉儲,請嘗試此:

public void dumpBytesToStdout(final byte[] array)
{
    for (final byte b: array)
        System.out.printf("%02X\n", b);
}

並在C#中執行等效的轉儲方法(不知道如何,我不執行C#)

或者,如果轉儲函數涉及大於字節的整數類型(例如int),請執行以下操作:

i & 0xff

刪除符號位。 請注意,如果強制轉換字節-1,則其內容為:

1111 1111

到一個int,這不會給:

0000 0000 0000 0000 0000 0000 1111 1111

但:

1111 1111 1111 1111 1111 1111 1111 1111

即符號位是“ carry”(否則,強制轉換將產生int值255,而不是-1)

暫無
暫無

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

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