接口请求,上传byte数组byte[]数据异常,负数变正数/负数变63

Posted ddgougou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了接口请求,上传byte数组byte[]数据异常,负数变正数/负数变63相关的知识,希望对你有一定的参考价值。

 

一、背景

最近项目中有个需求,就是需要把一个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的主要内容,如果未能解决你的问题,请参考以下文章

socketRead0(FileDescriptor, byte[], int, int, int)

C# 接收 java webservices接口返回的Byte[] 数组时,大于90M报错System.OutOfMemoryException 求高手解答

将byte数组转为Object

将byte数组转为Object

react中向后台服务器发送一请求 后台接口返回的是byte[]类型的图片 我现在如何在前台界面中显示它?

WCF(413)请求实体太大