求short转byte[]方法?为啥有的可以,有的不可以?

dennyjava 2008-04-21 02:47:41
各位大虾:
我的方法如下:
byte b[] = new byte[2];
b[0] = (byte) (n >> 8);
b[1] = (byte) n;
return b;
我把b[]转换成String通过socket传到客户端后,客户端受到的 数据有的正确,有的不正确,不知道哪里出错了???
请指点。

如:(short)9999 ->发送 -〉接受正常
(short)1234 ->发送-〉接受不正常
...全文
697 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
du_haiou 2009-06-25
  • 打赏
  • 举报
回复
up
云上飞翔 2008-04-22
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 dennyjava 的回复:]
谢谢各位。

to joejoe:
我的方法是:short seq = (short) ( ( (0x000000FF & b3[0]) < <8) ¦ ( 0x000000FF & b3[1]) );
这是我测试了好久才得到的正确方法。对方用c语言发送的short类型。


to jiangnaisong:
对方socket client端是已经写好的(linux c),我方控制不了。
我用
dos.writeInt(int值);//4个字节
dos.writeInt(int值);//4个字节
dos.writeShort(s); //2个字节
dos.…
[/Quote]

答:dennyjava兄弟,你早点讲一下是java与对方c之间通信,我们就更能早点解决问题了。
消息体传送:
如:String messageBody="你好吗?";
则发送用(对方用c来收):
dos.write(messageBody.getBytes("GBK"));//或对方linux c能正确认识的字符编码

以上仅供你参考
dennyjava 2008-04-22
  • 打赏
  • 举报
回复
我测试了多次,发现用dos.writeUTF,dos.writeBytes,dos.writeChars去传送报文体,都有问题,
但printwriter的println方法没有问题,所以现在我得用
dos.writeInt();
dos.writeInt();
dos.writeShort();
去发送报文头;
用printWriter.println()去发送报文体,很麻烦,有好办法嘛?
dennyjava 2008-04-22
  • 打赏
  • 举报
回复
谢谢各位。

to joejoe:
我的方法是:short seq = (short) ( ( (0x000000FF & b3[0])<<8) | ( 0x000000FF & b3[1]) );
这是我测试了好久才得到的正确方法。对方用c语言发送的short类型。


to jiangnaisong:
对方socket client端是已经写好的(linux c),我方控制不了。
我用
dos.writeInt(int值);//4个字节
dos.writeInt(int值);//4个字节
dos.writeShort(s); //2个字节
dos.writeUTF(串);

方式发送给他,
dos.writeInt(int值);//4个字节
dos.writeInt(int值);//4个字节
dos.writeShort(s); //2个字节
没问题,但dos.writeUTF(串); 发送的消息体有时对方接受正常,有时不正常,也不知道为啥。
dennyjava 2008-04-22
  • 打赏
  • 举报
回复
谢谢jiangnaisong,问题解决,结贴
云上飞翔 2008-04-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dennyjava 的回复:]
谢谢 jiangnaisong
照你说的,我用了DataOutputStream ,之前我用的是PrintWriter。
dos.writeShort()可以让short正确传送,但有新问题:
我有一个报文,格式 消息头 int(4byte)+int(4byte)+short(2byte)
消息体 msgid(string 24) + result(string 1)
为用DataOutputStream进行传送,对于 int(4byte)+int(4byte),我直接用dos.writeBytes();
对于 short(2byte),我用dos.writeS…
[/Quote]

答:没有问题。如:
dos.writeInt(int值);//4个字节
dos.writeInt(int值);//4个字节

dos.writeShort(s); //2个字节
dos.writeUTF(串);
对方收时用:DataInpuutStream流不相应读取就行了。

joejoe1991 2008-04-21
  • 打赏
  • 举报
回复
我想知道你在接收到这个字节数组以后,是怎么还原成一个short类型的数的。
dennyjava 2008-04-21
  • 打赏
  • 举报
回复
up...
dennyjava 2008-04-21
  • 打赏
  • 举报
回复
谢谢 jiangnaisong
照你说的,我用了DataOutputStream ,之前我用的是PrintWriter。
dos.writeShort()可以让short正确传送,但有新问题:
我有一个报文,格式 消息头 int(4byte)+int(4byte)+short(2byte)
消息体 msgid(string 24) + result(string 1)
为用DataOutputStream进行传送,对于 int(4byte)+int(4byte),我直接用dos.writeBytes();
对于 short(2byte),我用dos.writeShort()
对于消息体,我用 dos.writeBytes(消息体串,如:"200820082008200820082008" +"1" )
发送的demo 如:
dos.writeBytes(...);
dos.writeShort(s);
dos.writeBytes(...);


对方socket接收后,发现消息体内容有时正常,有时异常,这是为何?是不是dos这样发送同一报文的不同部分,不正确阿?请执教
云上飞翔 2008-04-21
  • 打赏
  • 举报
回复
答:或者是:先检查一下对方接收到的字节byte[]数据对不对,然后再查:由byte[]转换成short对不对。这样问题应该能解决了。
云上飞翔 2008-04-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dennyjava 的回复:]
to jiangnaisong:
我的主要目的是求一个将short 不失精度的转换为byte[]的方法。因为我上面的方法进行转换后,对方得到的值有的正常,有的不正常。
[/Quote]
答:你的真正目的是不是:通过网络传递short的值?若是:则不用转换成byte[],直接用DataOutputStream中的dos.writeShort(short值)即行了。若不是:就是要转成byte[],则:你的代码2楼的代码都是正确的!你好检查一下对方程序的网络接收部分的代码

以上仅供你参考
dennyjava 2008-04-21
  • 打赏
  • 举报
回复
谢谢两位。
to powerless2008:
我用你的方法,将(short)1235传过去,对方得到的是1087。


to jiangnaisong:
我的主要目的是求一个将short 不失精度的转换为byte[]的方法。因为我上面的方法进行转换后,对方得到的值有的正常,有的不正常。
我是风 2008-04-21
  • 打赏
  • 举报
回复
short to byte:
byte[] b = new byte[2];
b[0] = (byte)((n & 0xFF00) >> 8);
b[1] = (byte)(n & 0xFF);


byte to short:
n = (short)(((b[0] < 0 ? b[0] + 256 : b[0]) << 8) + (b[1] < 0 ? b[1] + 256 : b[1]));
云上飞翔 2008-04-21
  • 打赏
  • 举报
回复
答:不明白你要问的到底是什么?若仅仅是通过网络正确传递数据,你就将byte[]数据块直接传递即行了。若是要传递short,则用DataOutputStream流,通过dos.writeShort(short值)向网络直接写就行了。
  我不明白你的真正意图。

62,623

社区成员

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

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