网络传输中,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
分享到:
相关推荐
当Java程序需要与使用Little-Endian的系统(如C/C++)交换数据时,就需要进行字节序转换。例如,上述代码展示了如何实现一个简单的字节序反转函数`ReversEndian()`,用于将Little-Endian数据转换为Big-Endian。在...
Java实现的进制转换工具类完整示例 Java实现的进制转换工具类是...Java实现的进制转换工具类可以广泛应用于各种场景,如数据加密、颜色表示、IP地址表示等。在使用该工具类时,需要根据实际情况选择合适的方法和参数。
### 使用4个字节存放IP地址的C语言实现 在计算机网络中,IP地址是用于唯一标识互联网上每个节点的数字标识。IPv4是最常用的版本之一,它采用32位二进制数表示,通常被划分为四个8位字段,分别对应于四个十进制数字...
在IT领域,字节转换是数据处理中常见且重要的操作,尤其在编程和网络通信中。字节转换工具,如标题所示,是用来处理字节序列的实用程序,可以帮助程序员将数据从一种字节格式转换为另一种。在此,我们有两个特定的...
可以使用`InetAddress`类的`getByAddress()`方法,将IP字符串转换为字节数组,然后将每个字节转换为十进制数。 ```java String[] ipParts = ipAddress.split("\\."); int ipInt = ((Integer.parseInt(ipParts[0]) )...
例如,你可以使用`InetAddress.getByName("hostname")`来获取指定主机名的IP地址,或者使用`InetAddress.getByAddress(byte[] address)`来根据IP字节序列获取`InetAddress`实例。 然而,对于大规模的IP查询,如获取...
本文将详细介绍如何在JAVA中实现IP地址与整数之间的相互转换,并给出具体的代码示例。 #### 一、基础知识 ##### IP地址到整数的转换 1. **IP地址转化为字节数组**:首先,需要将点分十进制表示的IP地址转化为字节...
在Java编程环境中,读取纯真IP地址数据库是一项常见的任务,尤其对于需要进行IP定位或者网络管理的应用来说。纯真IP数据库(通常称为QQWRY或IPSeeker)是一个包含了全球IP地址及其对应地理位置信息的数据库,它由一...
在Java编程中,将IP地址转换为int类型的方法是一个常见的技术问题,这涉及到网络编程的基础知识和位操作。IP地址通常以点分十进制的形式表示(如"192.168.1.116"),而转换为int类型则需要将每个八位段(byte)分别...
总的来说,`ip、mac标准格式转换工具(java)`是一个帮助程序员在Java环境中高效处理IP和MAC地址的实用工具。通过理解这些基本概念并熟练运用这些工具类,开发者可以更轻松地应对涉及网络通信的编程挑战。
8. **IO流**:理解字节流和字符流,以及文件流、对象流、缓冲流、转换流的使用,熟悉NIO(New IO)框架。 9. **反射**:了解如何使用反射API动态获取类信息,创建对象,调用方法,以及修改私有属性。 10. **设计...
在Java编程环境中,实现IP库通常涉及到网络编程和数据处理,这主要为了处理与IP地址相关的各种任务,如IP解析、IP地理位置定位、IP到主机名的映射等。在这个场景下,`java IP库实现`可能是一个自定义的Java库,用于...
通过`byteArrayToLong`方法将读取到的字节数据转换为长整型数字,便于比较和计算。这里采用了小端序(little-endian)的字节顺序进行转换,因为计算机内部通常以小端序存储数据。 #### 3. 字节数据读取 `readBytes...
- `getIpByteArrayFromString(String ip)`:这个方法将 IP 字符串(例如 "192.168.1.1")转换为字节数组。它通过分隔符 "." 分割 IP 地址,并将每个部分转换为整数,然后再转换为字节。 - `getIpStringFromBytes...
根据给定的信息,本文将详细解释如何将IPv4与IPv6地址从字符串形式转换为`BigInteger`数字形式,以及反向操作的过程。 ### IPv4与IPv6简介 #### IPv4 IPv4(Internet Protocol Version 4)是互联网协议的第四版,...
在Java编程中,IP地址和整数之间的转换是网络编程中的常见操作。这涉及到将IP地址(IPv4格式,如192.168.1.1)表示为一个整数,以及将整数还原为IP地址。下面将详细解释这两种转化方法,并提供相关的Java代码示例。 ...
你可以在这里将字节缓冲区转换为实际对象,然后进行处理。 ```java @Override public void channelRead(ChannelHandlerContext ctx, Object msg) { ByteBuf in = (ByteBuf) msg; try { byte[] bytes = new byte...
在Java中,Socket提供了基于TCP/IP协议的低级别通信接口,而字节流则是处理数据的基本单位,适合处理任何类型的数据,因为所有数据最终都可以转化为字节序列。 在上述代码中,我们看到了一个简单的Java Socket...
可以使用`InetAddress`的`getByAddress()`方法将IP字符串转换为字节数组,再转换为整数。 3. **数据结构优化**: - 考虑到IP地址的连续性,可以使用`TreeMap`来存储IP范围,其中键是IP地址的整数值,值是地理位置...
7. **.jar 文件**:`获取域名所在IP地址.jar`是一个Java应用程序的可执行文件,由Java编译器编译后的字节码文件(.class)打包而成。运行这个.jar文件,用户可以直接执行程序,无需安装Java开发环境。 总结来说,这...