请教高手一个byte[] 数组传递的问题,高手请进,在线等

zhangtian24 2014-07-26 02:40:08
我使用 HttpURLConnection 传递byte数组时,在接收方获得的数据不对
HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
out = conn.getOutputStream();
out.write(我拼的字节数组)

字节数组的内容大致为:
byte[] a = new byte[]{98,95,-127,15,52,3,0,9};
byte[] b = "a=".getBytes();
然后将a和b合并为一个大的数组c
out.write(c)



我在action中通过
request.getParameter("a").getBytes(); 发现传递过来的 负数的byte全部变为正数了
传送的byte[]为:

接到的byte[]为:



本人QQ:3011563421
...全文
534 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wyx100 2014-07-28
  • 打赏
  • 举报
回复
引用 10 楼 vnvlyp 的回复:
[quote=引用 7 楼 zhangtian24 的回复:] @vnvlyp 请帮忙在分析下 你好,按照你所说的,我测试了一下 传输的数据和接收的数据还是不一致; 传送的是 {98,95,-127,15,52,3,0,9}; 收到的是 {98,95,-63,15,52,3,0,9}; 下面是截图:
你这个问题有点奇葩。。你试试在发送和接收时打印一下str的值,看看是否是一致的。 另外回复使用@是无效的,请用“引用”功能。[/quote]顶
vnvlyp 2014-07-28
  • 打赏
  • 举报
回复
引用 7 楼 zhangtian24 的回复:
@vnvlyp 请帮忙在分析下 你好,按照你所说的,我测试了一下 传输的数据和接收的数据还是不一致; 传送的是 {98,95,-127,15,52,3,0,9}; 收到的是 {98,95,-63,15,52,3,0,9}; 下面是截图:
你这个问题有点奇葩。。你试试在发送和接收时打印一下str的值,看看是否是一致的。 另外回复使用@是无效的,请用“引用”功能。
zhangtian24 2014-07-28
  • 打赏
  • 举报
回复
@vnvlyp 请问为什么你强烈推荐的BASE64Decoder,反而不可以呢?????
zhangtian24 2014-07-28
  • 打赏
  • 举报
回复
@vnvlyp 设置编码为iso-8859-1是可以
String str = "a=" + new String(a, "iso-8859-1");;


zhangtian24 2014-07-28
  • 打赏
  • 举报
回复
@vnvlyp 请帮忙在分析下
你好,按照你所说的,我测试了一下
传输的数据和接收的数据还是不一致;
传送的是
{98,95,-127,15,52,3,0,9};
收到的是
{98,95,-63,15,52,3,0,9};


下面是截图:

zy_think123 2014-07-27
  • 打赏
  • 举报
回复
我知道了,那是你超出了范围,因为有符号的byte的范围是-2^7+1----》126所以你的是超出范围了
zy_think123 2014-07-27
  • 打赏
  • 举报
回复
你将-127换成其他数字试一试呢?
vnvlyp 2014-07-27
  • 打赏
  • 举报
回复
但是有时候你无法修改字符编码,或者修改字符编码是不太好的做法,比如你的情况,HTTP环境下,优先用文本格式发送数据,除非你在发送超大文件,比如图片,否则不应该发送乱七八糟的字节数据,如果真的要发送,请先用BASE64编码成字符串,再发送。 所以5楼的代码可以写成:
	public static void main(String[] args) throws Exception {
		byte[] bys1 = {98, 95, -127, 15, 32, 3, 0, 9};
		System.out.println(Arrays.toString(bys1));
		
		BASE64Encoder encoder = new BASE64Encoder();
		String str = encoder.encode(bys1);
		
		BASE64Decoder decoder = new BASE64Decoder();
		byte[] bys2 = decoder.decodeBuffer(str);
		
		System.out.println(Arrays.toString(bys2));
	}
具体到你这个需求
HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();
out = conn.getOutputStream();
byte[] a = new byte[]{98,95,-127,15,52,3,0,9};
BASE64Encoder encoder = new BASE64Encoder();
String str = "a=" + encoder.encode(a);
byte[] b = str.getBytes();
out.write(b);
String str = request.getParameter("a");
BASE64Decoder decoder = new BASE64Decoder();
byte[] a = decoder.decodeBuffer(str);
vnvlyp 2014-07-27
  • 打赏
  • 举报
回复
这个小例子可以重现这个问题(前提是你的机子是中文系统,并且默认字符集是GBK)
	public static void main(String[] args) {
		byte[] bys = {98, 95, -127, 15, 32, 3, 0, 9};
		System.out.println(Arrays.toString(bys));
		
		String str = new String(bys);
		System.out.println(Arrays.toString(str.getBytes()));
	}
修复上面这个程序的问题很简单,使用iso-8859-1编码骗一下编码器
	public static void main(String[] args) throws Exception {
		byte[] bys = {98, 95, -127, 15, 32, 3, 0, 9};
		System.out.println(Arrays.toString(bys));
		
		String str = new String(bys, "iso-8859-1");
		System.out.println(Arrays.toString(str.getBytes("iso-8859-1")));
	}
vnvlyp 2014-07-27
  • 打赏
  • 举报
回复
这是字符编码的问题 如果你要用字符串的形式传输字节数据,请先进行base64编码,将字节数据编码成字符串,再传输字符串,接收的时候将base64字符串解码就好了
zhangtian24 2014-07-27
  • 打赏
  • 举报
回复
只要是负数的都变成正数了

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧