lyong0703 2009-09-10 11:46
浏览 703
已采纳

关于Socket中的数据流获取

诚心请教,这段时间在做一个项目,一个GPRS的数据中心。GPRS终端通过Internet将数据传输至数据中心。所以我设想通过Socket去实现通讯。在做model的时候却出现了一个问题。我获取的一段心跳数据出现了错误,做数据比对是用十六进制的形式进行比对的(源数据是十六进制)。代码如下,不知道我错在什么地方请各位指点。[code="java"]
private BufferedReader getReader(Socket socket) throws IOException {
InputStream socketIn = socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}[/code]
[code="java"]
in= getReader(connection);
String str="";
while((str=in.readLine())!=null){

System.out.println("has receive....");
System.out.println("收到原码:"+str);
System.out.println("转换为16:"+ String2Hex(str));

if(str.equals("end"))

break;

}

connection.close();

}[/code]
转换成16进制的代码如下:
[code="java"]
public static String String2Hex(String s){
String str = "";
for(int i=0;i<s.length();i++){
int ch = s.charAt(i);
String ss = Integer.toHexString(ch);
str = str + ss;
}
return str.toUpperCase();
} [/code]
我自己分析了一下,但是不知道我的分析是否正确。我分析是在获取Socket的流时候就已经出现了错误,也就是
[code="java"]
InputStream socketIn = socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));

[/code] 所以str=in.readLine()就已经是一列错误的字符串了
[code="java"]该心跳包正确的16进制串为:6831003100689B13727077000260000001006A166831003100689B13727077000260000001006A166831003100689B13727077000260000001006A166831003100689B13727077000260000001006A166831003100689B13727077000260000001006A166831003100689B13727077000260000001006A16
我解析的为:68310310689b13727077026000106a1668310310689b13727077026000106a1668310310689b13727077026000106a1668310310689b13727077026000106a1668310310689b13727077026000106a1668310310689b13727077026000106a16
[/code]

[b]问题补充:[/b]
感谢megcker 但是问题还是没有解决啊 期待
[b]问题补充:[/b]
6831031068fffd727077026000106a16
这是我使用megcker提供的方法解析出来的前部分
[b]问题补充:[/b]
tfqjavaeye 说的这个控制字符没有读取出来的信息是一种思考的方向。但却不是做了((str=in.readLine())!=null)这个判断的原因。当我不用这个判断直接读取以后就转换也还是一样的缺少0
[b]问题补充:[/b]
以上解释出来的用的是[code="java"]DataInputStream dis = new DataInputStream(connection.getInputStream());

//BufferedReader streamReader = getReader(connection);

System.out.println("服务器接收到客户端的连接请求:" + String2Hex(dis.readLine())); [/code]
解析出来的为::68310310689b13727077026000106a1668310310689b13727077026000106a1668310310689b13727077026000106a1668310310689b13727077026000106a1668310310689b13727077026000106a1668310310689b13727077026000106a16

我在[url]http://www.leftworld.net/online/j2sedoc/javaref/java.io.datainputstream_dsc.htm#readUTF(java.io.DataInput)[/url]这里发现一段话
数据输入流和数据输出流以稍加修订的 UTF-8 格式表示 Unicode 字符串。
。。。。。。
这种格式与“标准的”UTF-8 格式的区别如下:
Null 字符 '\u0000' 用两个字节而不是一个字节格式编码,所以编码后的字符串永不会包含空字符。
不是到是不是因为他编码后的字符串不包含空字符才会导致 我在解析出来的数据中缺少0 也就是tfqjavaeye说的
[b]问题补充:[/b]
问题已经解决了 dwangel 的说法很正确啊 一直都只盯着流 却忽略了这里 多谢各位了

  • 写回答

6条回答 默认 最新

  • iteye_7589 2009-09-12 00:14
    关注

    原来以为你是传的字符……

    如果二进制字串,不要用 reader,reader是面向char
    会按char编码.
    两个字节的 0 0 会被合并成一个0 .......

    直接用InputStream读byte数组

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 高通安卓11提取完整线刷包软件,或者优博讯dt50顺丰刷机包
  • ¥20 C,有个译码器,换了信道就跑不出原来数据
  • ¥15 MIMIC数据库安装问题
  • ¥60 基于JTag协议开发Fpga下载器上位机,哪位大🐂有偿指导?
  • ¥20 全书网Java爬取数据
  • ¥15 怎么获取红包封面的原始链接,并且获取红包封面序列号
  • ¥100 微信小程序跑脚本授权的问题
  • ¥100 房产抖音小程序苹果搜不到安卓可以付费悬赏
  • ¥15 STM32串口接收问题
  • ¥15 腾讯IOA系统怎么在文件夹里修改办公网络的连接