zoukankan      html  css  js  c++  java
  • netty6---序列化与反序列化

    package com.cn;
    
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.IOException;
    import java.util.Arrays;
    
    public class Test1 {
    
        public static void main(String[] args) throws IOException {
            int id = 101;  //把id转换为字节数据,一个int占4个字节,
            int age = 21;
            
            //int转换为字节数组
            ByteArrayOutputStream arrayOutputStream = new ByteArrayOutputStream();
            arrayOutputStream.write(int2bytes(id));
            arrayOutputStream.write(int2bytes(age));
            
            byte[] byteArray = arrayOutputStream.toByteArray();//[0, 0, 0, 101, 0, 0, 0, 21]
            
            System.out.println(Arrays.toString(byteArray));
            
            //字节数组转换为int
            ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(byteArray);
            byte[] idBytes = new byte[4];//id占4个字节
            arrayInputStream.read(idBytes);
            System.out.println("id:" + bytes2int(idBytes));//id:101
            
            byte[] ageBytes = new byte[4];
            arrayInputStream.read(ageBytes);//age占4个字节
            System.out.println("age:" + bytes2int(ageBytes));//age:21
            
        }
        
        
        /**
         int转换成字节数组,使用的是大端序列方式。
         2种方式:
         1.大端字节序列:先写高位,再写低位
         2.小端字节序列:先写低位,再写高位
         */
        public static byte[] int2bytes(int i){
            byte[] bytes = new byte[4];  //int占4个字节
            bytes[0] = (byte)(i >> 3*8);//先获取高位,总共4个字节,向右移动3个字节,一个字节8位,
            bytes[1] = (byte)(i >> 2*8);
            bytes[2] = (byte)(i >> 1*8);
            bytes[3] = (byte)(i >> 0*8);
            return bytes;//[0, 0, 0, 101],[0, 0, 0, 21]
        }
        
        
        /**
         * 把字节数组转换为int。
         * int转换为字节数组时候bytes[0]是高位,向左移动3个字节,
         * 
         * 大端序列方式:
         */
        public static int bytes2int(byte[] bytes){
            return (bytes[0] << 3*8) |
                    (bytes[1] << 2*8) |
                    (bytes[2] << 1*8) |
                    (bytes[3] << 0*8);
        }
    }
    package com.cn;
    
    import java.nio.ByteBuffer;
    import java.util.Arrays;
    
    public class Test2 {
    
        public static void main(String[] args) {
            int id = 101;
            int age = 21;
            
            //序列化
            //nio里面的ByteBuffer,申请8个空间,必须给定指定的大小,不会自动扩容。再写数据就会报错超出容量。
            ByteBuffer buffer = ByteBuffer.allocate(8);
            buffer.putInt(id);
            buffer.putInt(age);
            byte[] array = buffer.array();
            System.out.println(Arrays.toString(buffer.array()));//[0, 0, 0, 101, 0, 0, 0, 21]
            
            //反序列化
            ByteBuffer buffer2 = ByteBuffer.wrap(array);
            System.out.println("id:"+buffer2.getInt());//先写的是id
            System.out.println("age:"+buffer2.getInt());//后写的是age
            //id:101,age:21
        }
    
    }
    package com.cn;
    
    import java.util.Arrays;
    
    import org.jboss.netty.buffer.ChannelBuffer;
    import org.jboss.netty.buffer.ChannelBuffers;
    
    public class Test3 {
        public static void main(String[] args) {
    
            //netty里面的ChannelBuffer,封装了ByteBuffer,可以自动扩容。
            ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
            buffer.writeInt(101);
            buffer.writeDouble(80.1);
    
            byte[] bytes = new byte[buffer.writerIndex()];//大小根据ChannelBuffer的写指针决定。
            buffer.readBytes(bytes);
            
            System.out.println(Arrays.toString(bytes));//[0, 0, 0, 101, 64, 84, 6, 102, 102, 102, 102, 102]
            System.out.println("abc".getBytes());//[B@29453f44
            
            //
            ChannelBuffer wrappedBuffer = ChannelBuffers.wrappedBuffer(bytes);//传一个字节数组
            System.out.println(wrappedBuffer.readInt());
            System.out.println(wrappedBuffer.readDouble());
            
        }
    
    }
  • 相关阅读:
    CMDXP.CMD命令大全
    ASP.NET 页生命周期概述
    使用 ASP.NET 2.0提供的WebResource管理资源
    软件包管理 之 Fedora / Redhat 软件包管理指南
    开源代码分析研究 之 BugNet (2008年1月14日更新 第一章BugNet 简介 已完成)
    软件包管理 之 如何编译安装源码包软件
    硬件管理 之 Linux 硬件管理的基础知识
    软件包管理 之 fedorarpmdevtools 工具介绍
    软件包管理 之 Fedora/Redhat 在线安装更新软件包,yum 篇 ── 给新手指南
    系统引导管理 之 系统引导过程及硬盘分区结构论述
  • 原文地址:https://www.cnblogs.com/yaowen/p/9056506.html
Copyright © 2011-2022 走看看