Netty 快速入门系列 - Chapter 6 自定义数据协议【第十三讲】 通过大端序列方法将4个字节int转成 byte数组
2018-03-26 08:42
671 查看
第一种方法: 通过大端序列方法将4个字节int转成 byte数组
大端序列方法:
int2bytes:
将int 从高到低位分别保存到 byte[0] ~ byte[3]
byte[] bytes = new byte[4];
for (int i = 0; i < bytes.length; i++) {
bytes[i] = (byte) ((val >> 8 * (3 - i)));
}
当 i =0 时, bytes[0] = (byte) ((val >> 24));
一个int 32位, 向右移动24位,高32-24=8位将移动到最低位上,通过强制byte转换,仅仅保留8个字节。
例如:01111111 00000000 00000000 00000000 --(>> 24)->00000000 00000000 00000000 01111111
bytes2int:
还原高位,即向左移动。0xff:二进制:11111111
如果 i=0, 最高位 bytes[i] & 0xff 仅仅保留 8位, 再((bytes[i] & 0xff) << (8 * 3)) 左移动24位
01111111 -》[b]01111111 00000000 00000000 00000000 [/b]
通过| 与运算 1|0 =1 0|0=0 1|1=1
val =0 二进制
[b]00000000 00000000 00000000 00000000
[/b]
[b]01111111 00000000 00000000 00000000
[/b]
通过与运算,输出[b]01111111 00000000 00000000 00000000 [/b]
int val = 0;
for (int i = 0; i < bytes.length; i++) {
val = val | ((bytes[i] & 0xff) << (8 * (3 - i)));
}
package com.john.netty.learn.ch08.test;
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 = 123456789;
int age = 21;
System.out.println(Arrays.toString(int2bytes(id)));
System.out.println(Arrays.toString(int2bytes(age)));
System.out.println("id:" + bytes2int(int2bytes(id)));
System.out.println("age:" + bytes2int(int2bytes(age)));
}
/**
* 大端序列方法
*
* @param val
* @return
*/
public static byte[] int2bytes(int val) {
byte[] bytes = new byte[4];
for (int i = 0; i < bytes.length; i++) {
bytes[i] = (byte) ((val >> 8 * (3 - i)));
}
return bytes;
}
public static int bytes2int(byte[] bytes) {
int val = 0;
for (int i = 0; i < bytes.length; i++) {
val = val | ((bytes[i] & 0xff) << (8 * (3 - i)));
}
return val;
}
}
所有源码下载 :https://download.csdn.net/download/netcobol/10308871
相关文章推荐
- Netty 快速入门系列 - Chapter 6 自定义数据协议【第十五讲】自定义方法Serializer
- Netty 快速入门系列 - Chapter 6 自定义数据协议【第十四讲】ByteBuffer 和 ChannelBuffers
- Netty 快速入门系列 - Chapter 7 数据包协议【第十七讲】解决方案- 分割符 及 长度+数据
- Netty 快速入门系列 - Chapter 7 数据包协议【第十六讲】数据传输问题
- Netty 快速入门系列 - Chapter 8 数据包协议【第二十一讲】FrameDecoder 讲解
- Netty 快速入门系列 - Chapter 7 数据包协议【第十八讲】解决方案-经典协议包结构
- Netty 快速入门系列 - Chapter 8 数据包协议【第二十二讲】Socket攻击及防护
- Netty 快速入门系列 - Chapter 8 数据包协议【第二十讲】解决方案-Pipeline用例代码
- Netty 快速入门系列 - Chapter 7 数据包协议【第十九讲】解决方案-粘包分包原理
- Netty 快速入门系列 - Chapter 1 传统OIO与NIO - NIO 【第二讲】
- Netty 快速入门系列 - Chapter 3 Netty5.x【第八讲】 - Client 重连
- [新手入门]快速学习 ADO.NET Entity Framework系列文章 #4 -- 数据新增、删除、修改(ObkectContext的 .SaveChange()方法)
- Netty 快速入门系列 - Chapter 5 Netty之序列化【第十一讲】 Protocol buff
- Netty 快速入门系列 - Chapter 2 Netty3.x 【第四讲】 - 基本原理
- Unity3D中的socket通信之八(字节数组与数据转换dll-byte int string float)
- Netty 快速入门系列 - Chapter 3 Netty5.x【第七讲】 - Channel线程安全?
- Java 字节数组类型(byte[])与int类型互转方法
- 数据类型int跟byte[]数组互转的方法!
- Netty 快速入门系列 - Chapter 3 Netty5.x【第六讲】 -Netty5 案例
- Netty 快速入门系列 - Chapter 5 Netty之序列化【第十二讲】 Java Serializable