簡體   English   中英

java和c#中二進制文件的最佳編碼解碼

[英]best encode decode for binary file in java and c#

我知道有很多類型的編碼和解碼,根據我的閱讀,base64是編碼二進制文件(圖像,mp3,視頻)的絕佳選擇。

現在,當涉及到解碼時,我需要從base64轉換然后獲取字符串值。 解碼后獲取字符串的過程,我將要求這樣做(在c#中): System.Text.Encoding.ASCII.GetString(encodedDataAsBytes);

在這里我注意到我有幾個選項來使用什么來獲取字符串,如ASCII,UNICODE,DEFAULT。

這篇文章中的真正問題是如果我使用java編碼和c#解碼二進制文件,我應該使用什么是最好的解決方案/選擇? 我嘗試了幾種方法,有些字符無法讀取,因此給出了問號符號(?)。

然而,可以讀取字節的最接近的編碼解碼是當我在Java中使用它時: String encoded = Base64.encodeToString(fileData, Base64.CRLF); 同時在c#im中使用如下: byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData); string returnValue = System.Text.Encoding.ASCII.GetString(encodedDataAsBytes); byte[] encodedDataAsBytes = System.Convert.FromBase64String(encodedData); string returnValue = System.Text.Encoding.ASCII.GetString(encodedDataAsBytes);

不過,有幾個字符無法讀取。 有沒有人有這個問題陳述的解決方案? 任何反饋都非常感謝。 謝謝你的進步。

關於二進制文件的問題是它們是二進制文件 (類型為byte[] )。 大多數情況下,您無法將字節直接轉換為字符串(使用Encoding.GetString(byte[]) ),因為其中一些可能具有無法在字符串中表示的值(這正是您所遇到的)。

使用Encoding.GetString(byte[])將二進制數據轉換為字符串以將其轉換為BASE64完全沒有意義,因為在將二進制信息轉換為字符串時丟失信息 - 您需要將其直接轉換為BASE64。

將字節數組的BASE64字符串表示形式轉換為byte[]是正常的 - 這可以返回原始二進制數據。 但是,由於我上面給出的原因,將此byte[]轉換為string不正常。

BASE64編碼應該如何工作:

  1. 獲取二進制數據為byte[]
  2. byte[]創建BASE64字符串
  3. 轉移BASE64字符串
  4. 從BASE64字符串創建byte[]
  5. 繼續使用byte[]

你聲明輸入是“圖像,mp3,視頻”,所以:任意二進制。 然后,您聲明您正在使用base-64,這意味着:由於某種原因,您需要將此數據作為字符串傳輸/存儲(注意:傳輸/存儲作為原始二進制文件通常是首選 - base-64具有開銷)。

現在,當涉及到解碼時,我需要從base64轉換然后獲取字符串值。

有問題; 這里沒有字符串值 “圖像,mp3,視頻”根本不是“字符串值”。 可以做的是從base-64解碼回原始二進制文件(java或c#中的平凡),但這就是你所能做的 如果你需要來自原始二進制文件的“字符串值”,你唯一能做的就是通過base-64重新編碼它(這會讓你回到你開始的那個),或者其他一些base-n。

如果已知二進制數據實際上是存儲在該編碼中的文本數據,則只有ASCII或UTF-8等文本編碼才有意義。 您不能使用UTF-8來“解碼”實際上不是UTF-8的二進制文件。

如果您想在解碼數據后獲取字符串,則意味着您的數據以某種方式呈現為文本格式。如果是這種情況,您應該了解文件的初始編碼,例如UTF-8。 然后你可以正確解碼字符串。 如果您的程序僅將文件從一個地方傳輸到另一個地方而不對其內容執行任何操作,則最好在解碼時將其保留。

  1. 使用UTF-8 (或其他一些,如果您有理由) 將字符串對象(Java或C#)轉換為字節數組
  2. 您現在擁有二進制數據,UTF-8編碼的文本是特定的。 如果您需要將其傳輸到某個地方(不支持原始二進制數據或UTF-8文本),或者如果您不想擔心某些具有特殊含義的字符(如XML),請使用base64編碼將其轉換為ASCII字符串
  3. 用ASCII字符串做任何你想做的事情 (base64甚至允許一些空格修改等)將它帶到解碼器。
  4. 使用base64解碼將ASCII字符串轉換回字節數組
  5. 使用UTF-8編碼將字節數組轉換回字符串對象(C#或Java)

如果二進制數據或UTF-8文本沒問題,則可以跳過步驟2和4.但是需要1和5,因為在C#和Java等語言中,字符串是“邏輯字符”,它不是可以存儲或傳輸的字節(當然它是內存中的字節,通常是UTF-16或UTF-32,但你不應該關心它)。 必須使用某種編碼將其轉換為字節。 UTF-x是唯一不會丟失任何字符的字符,如果大多數字符來自“西方”字母,則UTF-8最節省空間。

關於base64的一個特殊之處在於,雖然它實際上是7位ASCII字符,但是您可以使用任何字符串編碼將base64編碼的文本放入C#/ Java字符串對象並返回到base64編碼的字節數組,因為所有使用的字符串編碼都是超集7位ASCII。 因此,您可以獲取圖像數據,base64對其進行編碼,並將結果文本放入String對象,而無需擔心編碼和損壞。

二進制文件的步驟:

  1. 獲取像PNG圖像文件這樣的二進制文件的內容到字節數組。
  2. 與上面的步驟2相同,但數據不是UTF-8。
  3. 與上面的第3步相同
  4. 與上面的第4步相同
  5. 您現在擁有包含步驟1中的PNG文件內容的字節數組。

暫無
暫無

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

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