使用数组和队列的方式解析字节

下面的逻辑为:从socket通道中读取到接收的数据到字节缓冲区,将缓冲区中的数据输出到字节的数据btyes中,再将数组中的数据一个个读取到字节队列bytesto 中(过来掉不需要的字节),最终

将bytesto 的数据转换到数组arr中,通过 new String(byte[] bytes, Charset charset)的方式将字节数据arr转换为指定字符集的字符串。(字符集转换的时候,一定要注意,有的时候一不小心就转为乱码了!)

// 返回为之创建此键的通道。
client = (SocketChannel) selectionKey.channel();
//将缓冲区清空以备下次读取
receivebuffer.clear();

//创建数据缓冲区receivebuffer

private   ByteBuffer receivebuffer = ByteBuffer.allocate(BLOCK);

//读取服务器发送来的数据到缓冲区中
count = client.read(receivebuffer);  // count 为缓冲字节的长度
if (count > 0) {
String receiveText = new String(receivebuffer.array(),0,count,"UTF-8");
// receiveText = new String(receivebuffer.array());
System.out.println("\r\n[接受到数据]:"+receiveText);

/**************************************************************/
receivebuffer.flip();
byte[] bytes = new byte[receivebuffer.remaining()];
receivebuffer.get(bytes);

// byte[] bytes= receiveText.getBytes();
// byte[] bytes=receiveText.getBytes("UTF-8");
List <Byte> bytesto = new LinkedList <Byte> ();
String msg="";
byte byteTemp = MLLP_START;
for(int i=0;i<bytes.length;i++){
byte[] b = new byte[1];
b[0]=bytes[i];
if(b != null && b.length > 0){
byteTemp = b[0];
}
if (byteTemp != MLLP_START && byteTemp != MLLP_END1)
{
bytesto.add (byteTemp);

}
}

byte[] arr = new byte[bytesto.size ()];
for (int i = 0; i < bytesto.size (); i++)
{
arr[i] = bytesto.get (i);
}
// msg = new String (arr, "GBK");
msg = new String (arr, "UTF-8");

ui.setMessage("从serverSocket获得信息:"+msg);
logger.info("从serverSocket获得信息:"+msg);
System.out.println("接收:"+msg); //处理消息内容

}

时间: 2025-01-06 04:35:00

使用数组和队列的方式解析字节的相关文章

QT开发(四十二)——DOM方式解析XML

QT开发(四十二)--DOM方式解析XML 一.DOM简介 1.DOM简介 DOM是Document Object Model的简写,即XML文档对象模型,是由W3C提出的一种处理XML文档的标准接口. DOM 一次性读入整个XML文档,在内存中构造为一棵树(DOM树)将XML文件表示成一棵树,便于随机访问其中的节点,但消耗内存相对多一些.能够在这棵树上进行导航,比如移动到下一节点或者返回上一节点,也可以对这棵树进行修改,或者是直接将这颗树保存为硬盘上的一个 XML 文件. 2.XML DOM节

IOS开发使用NSXMLParser、GDataXML两种方式解析XML数据

概括:XML数据解析方式有 *IOS原生的NSXMLParser,只支持SAX方式解析,使用简单 *C语言的libxml2,同时支持DOM和SAX方式解析 *google的GDataXML,只支持DOM方式解析,基于libxml2,使用时需要将编译环境配置为非ARC,并添加libxml2.dylib动态库 GDataXMLDocument 1 使用GDataXML的DOM方式解析XML,需要导入#import "GDataXMLNode.h" /** *  DOM方式解析XML数据 *

XML数据解析 Dom方式解析

这是一份XML数据,与上一篇文章的JSON数据内容是相同的,上一篇是JSON格式,这篇文章使用的是XML格式的数据 本文以上篇文章的代码为基础修改: 1>数据形式变为XML数据,所以要修改文件的路径 2>因为数据格式不同,所以解析方式不同先采用GData方式解析XML文档 需求:将此XML文档中的数据解析出来,通过tableView展示出来,上一篇文章的需求相同,只是数据与解析方法不同 此处只给出解析本分代码,即JSON解析2文章中代码部分,61--89行部分,开始部分修改文件路径. 使用GD

刨根究底字符编码之十一——UTF-8编码方式与字节序标记

UTF-8编码方式与字节序标记 一.UTF-8编码方式 1. 接下来将分别介绍Unicode字符集的三种编码方式:UTF-8.UTF-16.UTF-32.这里先介绍应用最为广泛的UTF-8. 为满足基于ASCII.面向字节的字符处理的需要,Unicode标准中定义了UTF-8编码方式.UTF-8应该是目前应用最广泛的一种Unicode编码方式(但不是最早面世的,UTF-16要早于UTF-8面世).它是一种使用8位码元(即单字节码元)的变宽(即变长或不定长)码元序列的编码方式. 由于UTF-16对

Android系列之网络(四)----SAX方式解析XML数据

?[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4044170.html 联系方式:[email protected] [系列]Android系列之网络:(持续更新) Android系列之网络(一)----使用HttpClient发送HTTP请求(通过get方法获取数据) Android系列之网络(二)----HTTP请求头与响应头 Androi

SAX方式解析xml文件查看天气

1.SAX方式解析xml文件的步骤: ①创建解析器工厂对象 ②使用当前配置的工厂参数创建SAXParser对象 ③解析xml文件 ④利用DefaultHandler创建事件驱动者 2.对于标签对象进行引用怎么办? ①定义当前解析的标签:private String tagName=null; ②在startElement()方法中赋值tagName:this.tagName=qName; ③在endElement()方法中将tagName赋值为空:this.tagName=null; ④在cha

通过Sax方式解析xml文件

说明:此案例使用的是通过Dom方式解析xml文件这篇文章里的City类和china.xml文件. 1. 因为xml文件有两种格式,一是上面那篇文章里的那种元素节点里只包含属性节点,另一种就是元素节点里包含元素节点和文本节点,于是在china.xml中添加如下代码,以实现两种方式的解析: <city> <cityname>杭州</cityname> <pyName>zhejiang</pyName> <quName>浙江</quN

网络相关系列之四:数据解析之SAX方式解析XML数据

一.XML和Json数据的引入: 通常情况下.每一个须要訪问网络的应用程序都会有一个自己的server.我们能够向server提交数据,也能够从server获取数据.只是这个时候就有一个问题,这些数据是以什么格式在网络上传输的呢?一般我们都会在网络上传输一些格式化后的数据,这样的数据会有一定的结构规格和语言,当还有一方收到数据消息后就能够依照同样的结构规格进行解析.从而取出它想要的那部分内容. 在网络上数据传输最经常使用的格式:XML和Json.本文就来学习一下XML数据的解析,Json格式的数

技术文章-数组与队列

在Java编程中,常常会遇到需要存储和处理大量同类信息的时候,这时候就要运用数组或者队列的数据存储结构来方便操作. 1.数组 定义:数组是属于数据结构中一种线性的数据结构,因为其对象在内存中的存储方式是一个连续的存储空间. 数组在使用时的书写格式:(以一维数组为) 定义和实例化对象同步进行: 已知存储数据的类型和长度时:数据类型 [] 数组名 = new 数据类型[长度]; 已经知道具体的每一项数据时:数据类型 [] 数组名 = {数据,...}; 已经知道具体的每一项数据同时规定数据类型时:数