杰瑞科技汇

Java Socket 如何处理16进制数据?

Java Socket 处理16进制数据

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

Java Socket 如何处理16进制数据?-图1
(图片来源网络,侵删)

将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进制数据的基本方法,根据实际需求,你可能需要调整缓冲区大小、处理超时、添加错误处理等。

Java Socket 如何处理16进制数据?-图2
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇