1. 程式人生 > >接口請求,上傳byte數組byte[]數據異常,負數變正數/負數變63

接口請求,上傳byte數組byte[]數據異常,負數變正數/負數變63

cati gin 字符 inf 進行 byte img nco 字節

一、背景

最近項目中有個需求,就是需要把一個byte[]數組上傳到服務端。但是我發現發送的byte數組和服務端接收的數組不一樣,所有的正數在傳遞時正確,數組長度也沒變化,但是負數變成了63或者負數全部變成了正數,具體如下圖:

技術分享圖片

二、原因

  原因的話,網上有人解釋是這樣的:可能在傳輸前沒有指定編碼格式,默認字符編碼是UTF-8,而UTF-8是一種可變長度的編碼,所以原來的byte數組內容就被改變了,而下面的方法二轉換成字符串時指定編碼方式ISO-8859-1進行編碼,該編碼方式為單字節字符編碼,即在將byte[]轉String時,每一個字節轉化成一個字符,是一種不可變長度的編碼方式,所以byte數組在轉化前後內容不變!

三、解決辦法

1)用base64對byte數組進行編碼,通過網絡傳輸接收到數據之後,再用base64對其解碼得到byte數組

byte[] byte2 = new byte[]{......};

String str = Base64.encodeBase64String(byte2);

......HTTPS傳輸......

byte[] byte = Base64.decodeBase64(str);

2)指定編碼進行傳輸

byte[] byte3 = new byte[]{......};

String isoString = new String(byte3,"ISO-8859-1");

......HTTPS傳輸......

byte[] byte = str.getByte("ISO-8859-1");

3)使用文件傳輸,可以將byte[]數組當做一個文件file傳輸,但是需要設置請求體的編碼類型為:application/octet-stream,在服務端使用file.getBytes()得到byte[]數組

技術分享圖片

接口請求,上傳byte數組byte[]數據異常,負數變正數/負數變63