2016-05-16 78 views
1

我傳遞C#&爪哇之間的數據,將它們轉換在4個階段:差異( 「UTF-8」)和Encoding.UTF8.GetBytes()的C#

  1. 到字節數組
  2. 字符串(簡單地增加每個字節爲字符)
  3. UTF8字節串

我已經發現了Java的轉換是UTF8不同於C#。

我將跳過下面代碼中的base64轉換。

Java代碼:

// The result is [-26, 16, 0, 0] 
byte[] bytes = ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt(4326).array(); 

StringBuilder sb = new StringBuilder(bytes.length); 
for (byte currByte : bytes) { 
    sb.append((char) currByte); 
} 

// The result is [-17, -90, -66, 16, 0, 0] 
byte[] utf8Bytes = sb.toString().getBytes("UTF-8"); 

C#代碼

MemoryStream objMemoryStream = new MemoryStream(); 
BinaryWriter objBinaryWriter = new BinaryWriter(objMemoryStream); 
objBinaryWriter.Write(4326); 

// The result [230, 16, 0, 0] 
byte[] objByte = objMemoryStream.ToArray(); 
StringBuilder objSB = new StringBuilder(); 
foreach (byte objCurrByte in objByte) 
{ 
    objSB.Append((char)objCurrByte); 
} 
string strBytes = objSB.ToString(); 

objBinaryWriter.Close(); 
objBinaryWriter.Dispose(); 

// The result is [195, 166, 16, 0, 0] 
var result = UTF8Encoding.UTF8.GetBytes(strBytes); 

兩個端陣列儘管輸入的陣列/字符串相同是不同的。 (Java的只是用符號字節顯示 - 但值相同)

我不能改變的C#代碼,因爲它是已使用的客戶..

如何調整,什麼是我的java代碼中的問題?

注:Java的管理閱讀從C#的結果的base64字符串,但隨後它與同樣的數據不同的字符串,C#語言不能正常閱讀產生..

回答

1

你的問題是,char是無符號,但字節已簽署。當你做(char) -26你正在做(char) (-26 & 0xFFFF)你們希望這是什麼(char) (-26 & 0xFF)

嘗試

for (byte currByte : bytes) { 
    sb.append((char) (currByte & 0xFF)); // -26 => 230 not 65510 
} 
+0

這麼簡單:)我真的忽略了符號/無符號的差異。我只是在我的頭上加256,並認爲每事情是一樣的..謝謝allot –

+0

@RazizaO對'byte','char'和'short'的操作首先被加寬爲'int',如果你使用了一個強制轉換,這很容易被忽略。 –