Java Socket 处理16进制数据
在Java中使用Socket处理16进制数据是一个常见的需求,特别是在与硬件设备或网络协议交互时,下面我将介绍几种处理16进制数据的方法。

将16进制字符串转换为字节数组
public static byte[] hexStringToByteArray(String s) {
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i+1), 16));
}
return data;
}
将字节数组转换为16进制字符串
public static String bytesToHex(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
sb.append(String.format("%02X ", b));
}
return sb.toString();
}
使用Socket发送16进制数据
import java.io.OutputStream;
import java.net.Socket;
public class HexSocketClient {
public static void main(String[] args) {
String hexString = "A1B2C3D4E5F6"; // 要发送的16进制数据
byte[] data = hexStringToByteArray(hexString);
try (Socket socket = new Socket("localhost", 8080);
OutputStream out = socket.getOutputStream()) {
out.write(data);
System.out.println("已发送16进制数据: " + bytesToHex(data));
} catch (Exception e) {
e.printStackTrace();
}
}
// 使用上面的hexStringToByteArray方法
}
使用Socket接收16进制数据
import java.io.InputStream;
import java.net.Socket;
public class HexSocketServer {
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(8080);
Socket clientSocket = serverSocket.accept();
InputStream in = clientSocket.getInputStream()) {
byte[] buffer = new byte[1024];
int bytesRead = in.read(buffer);
if (bytesRead > 0) {
byte[] receivedData = new byte[bytesRead];
System.arraycopy(buffer, 0, receivedData, 0, bytesRead);
System.out.println("接收到的16进制数据: " + bytesToHex(receivedData));
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 使用上面的bytesToHex方法
}
使用第三方库处理16进制数据
如果不想自己实现转换功能,可以使用Apache Commons Codec库:
// 添加依赖 // implementation 'commons-codec:commons-codec:1.15' import org.apache.commons.codec.binary.Hex; // 字节数组转16进制字符串 String hexString = Hex.encodeHexString(bytes); // 16进制字符串转字节数组 byte[] bytes = Hex.decodeHex(hexString.toCharArray());
处理大端序和小端序
在处理16进制数据时,需要注意字节序问题:
// 大端序转换
public static byte[] hexToBytesBigEndian(String hex) {
return hexStringToByteArray(hex);
}
// 小端序转换
public static byte[] hexToBytesLittleEndian(String hex) {
byte[] bigEndian = hexStringToByteArray(hex);
byte[] littleEndian = new byte[bigEndian.length];
for (int i = 0; i < bigEndian.length; i++) {
littleEndian[i] = bigEndian[bigEndian.length - 1 - i];
}
return littleEndian;
}
完整示例:双向通信的Socket客户端
import java.io.*;
import java.net.*;
public class HexSocketClientExample {
public static void main(String[] args) {
String serverAddress = "localhost";
int port = 8080;
try (Socket socket = new Socket(serverAddress, port);
OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream()) {
// 发送16进制数据
String sendHex = "01 02 03 04 05";
byte[] sendData = hexStringToByteArray(sendHex.replace(" ", ""));
out.write(sendData);
System.out.println("已发送: " + sendHex);
// 接收响应
byte[] buffer = new byte[1024];
int bytesRead = in.read(buffer);
if (bytesRead > 0) {
byte[] responseData = new byte[bytesRead];
System.arraycopy(buffer, 0, responseData, 0, bytesRead);
System.out.println("收到响应: " + bytesToHex(responseData));
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 使用前面的hexStringToByteArray和bytesToHex方法
}
代码展示了在Java Socket编程中处理16进制数据的基本方法,根据实际需求,你可能需要调整缓冲区大小、处理超时、添加错误处理等。

