java解析网络大端、小端解析方法
文章目录
- 一、背景介绍
- 二、说明
- 核心概念:什么是字节序(Endianness)?
- 大端字节序 (Big-Endian)
- 小端字节序 (Little-Endian)
- 三、不同解析方式介绍
一、背景介绍
中转台通过SNMP协议V1\V2上报中转台IP,然后程序解析入库,后来发现解析网络分大端、小端的不同解析方法。
当时数据库存多个字段:主节点IP、从节点IP、IP地址,通过看红框的部分发现就是正序和反序的区别,实际是相同的IP地址,只不过大端小端解析不同,最后结果也不同。因此记录下!
二、说明
核心概念:什么是字节序(Endianness)?
字节序指的是多字节数据在内存中或网络传输时,各个字节的存储顺序。
对于一个像 0x12345678 这样的32位整数(十六进制表示),它由4个字节组成:0x12, 0x34, 0x56, 0x78。
问题是:当我们把它存入内存(或通过网络发送)时,哪个字节在先?哪个字节在后?
这就产生了两种不同的规则:
大端字节序 (Big-Endian)
小端字节序 (Little-Endian)
三、不同解析方式介绍
大端解析
public String getBigEndianMasterIPAddress() {Object o = getItemValue(OID_REPEATER_MASTER_IP_ADDRESS);try {if (o != null) {int nIp = (Integer) o;byte[] ip = ByteBuffer.allocate(4).putInt(nIp).array();InetAddress ipaddr = InetAddress.getByAddress(ip);return ipaddr.getHostAddress();}} catch (UnknownHostException e) {logger.error("parse ip address error:", e);}return "";
}
小端解析
public String getMasterIPAddress() {Object o = getItemValue(OID_REPEATER_MASTER_IP_ADDRESS);try {if (o != null) {int nIp = (Integer) o;byte[] ip = new byte[]{(byte) (nIp & 0xFF),(byte) (nIp >> 8 & 0xFF),(byte) (nIp >> 16 & 0xFF),(byte) (nIp >> 24 & 0xFF)};InetAddress ipaddr = InetAddress.getByAddress(ip);return ipaddr.getHostAddress();}} catch (UnknownHostException e) {logger.error("parse ip address error:", e);}return "";
}