socket UDP连接问题求帮助,急急急!!!

yangxuebao123 2011-04-13 05:15:31
问题如下,

.net客户端发送的数据包是用bitConvert编译后发送过来的 。

我用java抓取包以后, 不知道 怎么转码了,求大家帮帮我 ,很急
...全文
117 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangxuebao123 2011-04-14
  • 打赏
  • 举报
回复
没有,关键是数据解析不出来了 , byte类型的数组解析出来还是乱的


用java .net都一样。
原来 2011-04-14
  • 打赏
  • 举报
回复
设备供应商提供的接口肯定没有问题,关键是用好
yangxuebao123 2011-04-14
  • 打赏
  • 举报
回复
这就是协议, 给你看看

使用UDP传输协议
传输数据格式如下:
1.GPS基础数据
10代表GPS数据,终端ID号11位,经度,纬度,日期时间,方向角,速度
10,16400015665,421725569,112269221,2010-6-2 11:05:05,123,0

终端ID号,11位,唯一标识终端
经纬度为int型,转double: double dx=(double)421725569 / 1024 / 3600;double dy=(double)112269221 / 1024 / 3600;
GPS方向角和速度都为int型

如:UDP监听接收到byte[] array

string RecieveStr=System.Text.Encoding.UTF8.GetString(array);
则RecieveStr的值的格式同“16400015665,421725569,112269221,2010-6-2 11:05:05,123,0”

2.报警数据

11代表GPS数据,终端ID号11位,经度,纬度,日期时间,方向角,速度
11,16400015665,421725569,112269221,2010-6-2 11:05:05,123,0,紧急报警
基础信息同上,后面多了报警信息描述“紧急报警”
yangxuebao123 2011-04-14
  • 打赏
  • 举报
回复
设备供应商完全忽悠我 , 我们在 开发GPS接收程序。
ChDw 2011-04-14
  • 打赏
  • 举报
回复
到底方法是什么啊。你怎么老变?

如果是
BitConverter.ToString(buffer, 0, readBytes).Replace("-", ",");

就是

String str = "5C6263";
byte[] b = new byte[str.length() / 2];
for(int i = 0; i < b.length; i++) {
char h = str.charAt(i * 2);
char l = str.charAt(i * 2 + 1);
int v = (h >= 'A' && h <= 'F') ? (h - 'A' + 10) : (h - '0');
v = (v << 4) | ((l >= 'A' && l <= 'F') ? (l - 'A' + 10) : (l - '0'));
b[i] = (byte) v;
}
System.out.println(Arrays.toString(b));


如果再需要将b转换成字符串,就new String(b,"UTF-8");
yangxuebao123 2011-04-14
  • 打赏
  • 举报
回复
按照你说的方法还是乱码。。


他说解码的方法是BitConverter.ToString(buffer, 0, readBytes).Replace("-", ",");


JAVA,我真的不知道怎么解了。
ChDw 2011-04-14
  • 打赏
  • 举报
回复
不应该有问题的,应该是你代码有问题


.net中
byte[] b = System.Text.Encoding.UTF8.GetBytes("The测试");
生成字节数组
{84,104,101,230,181,139,232,175,149}


在Java中

byte[] b = {84,104,101,(byte) 230,(byte) 181,(byte) 139,(byte) 232,(byte) 175,(byte) 149};
System.out.println(new String(b, "UTF-8"));

也是打印The测试的



可能是你没有注意
DatagramPacket packet

packet.getOffset()/getLength()属性,你拿出了多余的字节了
所以应该是new String(packet.getData(), packet.getOffset(), packet.getLength(), "UTF-8");
yangxuebao123 2011-04-14
  • 打赏
  • 举报
回复
Th @ 8B?
叱?
@ ? 7


乱码就是这样 。。


他是用.net 设置成byte类型的 包, 我 解不出来了
yangxuebao123 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 chdw 的回复:]
这些都是非常简单的转换而已,你还是找本书看看吧


String str = Integer.toString(Integer.parseInt(oldNum, 16));
return str.length() < 2 ? ("0" + str) : str;
[/Quote]
我自己解决了
ChDw 2011-04-14
  • 打赏
  • 举报
回复
这些都是非常简单的转换而已,你还是找本书看看吧


String str = Integer.toString(Integer.parseInt(oldNum, 16));
return str.length() < 2 ? ("0" + str) : str;
yangxuebao123 2011-04-14
  • 打赏
  • 举报
回复
java中怎么转啊, .net是这样toInt32
yangxuebao123 2011-04-14
  • 打赏
  • 举报
回复
54,68,00,00,40,00,01,38,42,00,39,17,18,0b,04,0e,05,27,29,03,df,ad,e0,0c,ea,12,d0,00,00,00,00,00,00,00,00,00,07,06,9f,0d,0a


public string ChangeNum(string oldNum)
{
return Convert.ToInt32(oldNum, 16).ToString().PadLeft(2,'0');
}
yangxuebao123 2011-04-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 luman2002 的回复:]
直接用toString()转不可以吗?
StringBuffer sMessage = new StringBuffer();
sbMessage.append(new String(getByteMessage,"UTF-8"));//getByteMessage是Socket收到的字节类型数据
String s = sbMessage.toString();

尝试一下
[/Quote]


尝试过了的, 是乱码
luman2002 2011-04-13
  • 打赏
  • 举报
回复
直接用toString()转不可以吗?
StringBuffer sMessage = new StringBuffer();
sbMessage.append(new String(getByteMessage,"UTF-8"));//getByteMessage是Socket收到的字节类型数据
String s = sbMessage.toString();

尝试一下
yangxuebao123 2011-04-13
  • 打赏
  • 举报
回复
我说错话了 ,那个 人说用.net 就一句代码 , System.Text.Encoding.UTF8.getString(array)

你帮我想想,怎么样把那个字节类型的 转换为String类型的。
ChDw 2011-04-13
  • 打赏
  • 举报
回复
不明白你的用法,你说UDP传输那应该是byte[]的传输啊,怎么会用ToString?

如果是ToString,对应Java也非常简单啊

string str = BitConverter.ToString(...);


在Java中解释就是
String str = "5C-62-63";
byte[] b = new byte[(str.length() + 1) / 3];
for(int i = 0; i < b.length; i++) {
char h = str.charAt(i * 3);
char l = str.charAt(i * 3 + 1);
int v = (h >= 'A' && h <= 'F') ? (h - 'A' + 10) : (h - '0');
v = (v << 4) | ((l >= 'A' && l <= 'F') ? (l - 'A' + 10) : (l - '0'));
b[i] = (byte) v;
}
yangxuebao123 2011-04-13
  • 打赏
  • 举报
回复
BitConverter.toString();

主要是解析这句话。,。
yangxuebao123 2011-04-13
  • 打赏
  • 举报
回复
你这个值能转double

我里面还有其它类型的了, 怎么办啊, 还有String类型的 。。
ChDw 2011-04-13
  • 打赏
  • 举报
回复
这个要看你在.net中是将什么转换成byte[]了

一般的double、long等都是按逆序处理而已


例如在.net中byte[] b = BitConverter.GetBytes(1.23);
会得到
174,71,225,122,20,174,243,63
这8个字节


在Java中处理

byte[] b = {
(byte) 174,71,(byte) 225,122,20,(byte) 174,(byte) 243,63
};
long l = 0;
for(int i = b.length - 1; i >= 0; i--)
l = (l << 8) | (b[i] & 0xFF);
System.out.println(Double.longBitsToDouble(l));
yangxuebao123 2011-04-13
  • 打赏
  • 举报
回复
会的请回答,全分相送, 感激不敬

81,092

社区成员

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

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