
java与c进行socket通讯byte问题
我用java编写c端程序,s端为c编写,现在s端要求我发的包前四个字节为包长度,数值型,即如果长度为212字节,则表示成0x000x000x000xd4,我c端程序前四个...
我用java编写c端程序,s端为c编写,现在s端要求我发的包前四个字节为包长度,数值型,即如果长度为212字节,则表示成0x00 0x00 0x00 0xd4,我c端程序前四个字节是这样算的:
int n =212;
byte[] ba=new byte[4];
ba[0]=(byte)(n%256);
n=n/256;
ba[1]=(byte)(n%256);
n=n/256;
ba[2]=(byte)(n%256);
n=n/256;
ba[3]=(byte)(n%256);
out.write(ba[3]);
out.write(ba[2]);
out.write(ba[1]);
out.write(ba[0]);
out.flush();
现在发过去的显示为 00 00 00 3f,经检查,好象是byte有符号位引起的,如果发的值小于127则没问题,请高手帮忙
现在是服务端程序不能动,只能想办法在客户端 java中解决,pujia12345说的溢出是对的,java byte是有符号的,只能表示-128-127之间的数,我程序中ba[0]原想得到的是212,实际在java上打印下来看已经变成-44了,即212的补码212-256=-44,而-44传到后台服务端时,服务端不认识有符号数,所以出现3f,即ascii=63,?号,使用int,short,char传都不行,结果一样 展开
int n =212;
byte[] ba=new byte[4];
ba[0]=(byte)(n%256);
n=n/256;
ba[1]=(byte)(n%256);
n=n/256;
ba[2]=(byte)(n%256);
n=n/256;
ba[3]=(byte)(n%256);
out.write(ba[3]);
out.write(ba[2]);
out.write(ba[1]);
out.write(ba[0]);
out.flush();
现在发过去的显示为 00 00 00 3f,经检查,好象是byte有符号位引起的,如果发的值小于127则没问题,请高手帮忙
现在是服务端程序不能动,只能想办法在客户端 java中解决,pujia12345说的溢出是对的,java byte是有符号的,只能表示-128-127之间的数,我程序中ba[0]原想得到的是212,实际在java上打印下来看已经变成-44了,即212的补码212-256=-44,而-44传到后台服务端时,服务端不认识有符号数,所以出现3f,即ascii=63,?号,使用int,short,char传都不行,结果一样 展开
展开全部
byte 由于在C java中都是有符号(-128到127)
所以你传大于127的数字就出现溢出
C语言解决 : 定义unsigned 无符号
Java解决 : 使用short
所以你传大于127的数字就出现溢出
C语言解决 : 定义unsigned 无符号
Java解决 : 使用short
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
ba[0]=(byte)(n%256);
n=n/256;
ba[1]=(byte)(n%256);
n=n/256;
ba[2]=(byte)(n%256);
n=n/256;
ba[3]=(byte)(n%256);
因为你是/当然认不出啦。。。直接-啊
而且需要强转,数字默认是都是int的
n=n/256;
ba[1]=(byte)(n%256);
n=n/256;
ba[2]=(byte)(n%256);
n=n/256;
ba[3]=(byte)(n%256);
因为你是/当然认不出啦。。。直接-啊
而且需要强转,数字默认是都是int的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
// 整数到字节数组转换
public static byte[] int2bytes(int n) {
byte[] ab = new byte[4];
ab[0] = (byte) (0xff & n);
ab[1] = (byte) ((0xff00 & n) >> 8);
ab[2] = (byte) ((0xff0000 & n) >> 16);
ab[3] = (byte) ((0xff000000 & n) >> 24);
return ab;
}
public static byte[] int2bytes(int n) {
byte[] ab = new byte[4];
ab[0] = (byte) (0xff & n);
ab[1] = (byte) ((0xff00 & n) >> 8);
ab[2] = (byte) ((0xff0000 & n) >> 16);
ab[3] = (byte) ((0xff000000 & n) >> 24);
return ab;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询