java 数字与字节的转换(IP与字节的转换)

网络传输中,Java 采用字节形式,所以涉及到字节与其他数据类型的转换。
本文以IP 为例进行讨论。

先看代码
本例 是,接收一个IP,转换为二进制数据传输,再转换为IP,
IP-->Binary-->IP


package com.mkyong.core;

public class BitwiseExample {

public static void main(String[] args) {

BitwiseExample obj = new BitwiseExample();
long ipAddressInLong = obj.ipToLong("192.168.1.2");
System.out.println(ipAddressInLong);

String binary = Long.toBinaryString(ipAddressInLong);
printPrettyBinary(binary);

String ipAddressInString = obj.longToIp(ipAddressInLong);
System.out.println(ipAddressInString);

}

public long ipToLong(String ipAddress) {

String[] addrArray = ipAddress.split("\\.");

long num = 0;
for (int i = 0; i < addrArray.length; i++) {

int power = 3 - i;

// 1. (192 % 256) * 256 pow 3
// 2. (168 % 256) * 256 pow 2
// 3. (2 % 256) * 256 pow 1
// 4. (1 % 256) * 256 pow 0
num += ((Integer.parseInt(addrArray[i]) % 256 * Math.pow(256, power)));

}

return num;
}

public String longToIp(long i) {

return ((i >> 24) & 0xFF) + "." + ((i >> 16) & 0xFF) + "." + ((i >> 8) & 0xFF) + "." + (i & 0xFF);

}

//print pretty binary code, padding left zero
private static void printPrettyBinary(String binary) {

String s1 = String.format("%32s", binary).replace(' ', '0');
System.out.format("%8s %8s %8s %8s %n",
s1.substring(0, 8), s1.substring(8, 16),
s1.substring(16, 24), s1.substring(24, 32));
}

}


输出

3232235778
11000000 10101000 00000001 00000010
192.168.1.2



Testing IP address = 192.168.1.2
Decimal Number = 3232235778

转换成10进制

192 x (256)^3 + 168 x (256)^2 + 1 x (256)^1 + 2 (256)^0 = ?
3221225472 + 11010048 + 256 + 2 = 3232235778

long ipAddress = 3232235778L;
String binary = Long.toBinaryString(ipAddress);
System.out.println(binary);
System.out.println((ipAddress>>24) & 0xFF);
System.out.println((ipAddress>>16) & 0xFF);
System.out.println((ipAddress>>8) & 0xFF);
System.out.println((ipAddress) & 0xFF);


11000000101010000000000100000010
192
168
1
2


为什么 (ipAddress>>24) & 0xFF will return 192


Decimal = 3232235778
Binary = 11000000 10101000 00000001 00000010
IpAddress = 192 168 1 2

(ipAddress>>24)
-------------------------->24
Binary = 00000000 00000000 00000000 11000000

(ipAddress>>24) & 0xFF
Binary = 00000000 00000000 00000000 11000000
& 0xFF = 00000000 00000000 00000000 11111111
Result = 00000000 00000000 00000000 11000000 = 192 (2^7 + 2^6)



(ipAddress>>16) & 0xFF = 168


Decimal = 3232235778
Binary = 11000000 10101000 00000001 00000010

(ipAddress>>16)
----------------->16
Binary = 00000000 00000000 11000000 10101000

(ipAddress>>16) & 0xFF
Binary = 00000000 00000000 11000000 10101000 = 49320 (2^14 + 2^15 + 2^7 + 2^5 + 2^3)
& 0xFF = 00000000 00000000 00000000 11111111
Result = 00000000 00000000 00000000 10101000 = 168


(ipAddress>>8) & 0xFF = 1


Decimal = 3232235778
Binary = 11000000 10101000 00000001 00000010

(ipAddress>>8)
-------->8
Binary = 00000000 11000000 10101000 00000001

(ipAddress>>8) & 0xFF
Binary = 00000000 11000000 10101000 00000001 = 12625921
& 0xFF = 00000000 00000000 00000000 11111111
Result = 00000000 00000000 00000000 00000001 = 1


(ipAddress) & 0xFF = 2


Decimal = 3232235778
Binary = 11000000 10101000 00000001 00000010

(ipAddress)
Binary = 11000000 10101000 00000001 00000010

(ipAddress) & 0xFF
Binary = 11000000 10101000 00000001 00000010 = 3232235778
& 0xFF = 00000000 00000000 00000000 11111111
Result = 00000000 00000000 00000000 00000010 = 2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

annan211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值