1

我需要一种将字符串“IP:PORT”转换为字节数组的方法。我知道如何手动格式化,但我需要一种自动格式化的方法。

示例 IP:

77.125.65.201:8099

我就是不能使用 "".getBytes(); 因为我需要以下格式(不带点和冒号):

[#1 octet ip] [#2 octet ip] [#3 octet ip] [#4 octet ip] [#1 2 octet port]

为了更好地理解:

77 125 65 201 8099

在Java中手动我可以设置它:

byte[] testIP = { 0x4D, 0x7D, 0x41, (byte)0xC9, (byte)0x1FA3 };

我需要找到一种方法,该方法将以正确的格式返回字节数组,并在必要时转换为字节(因为 Java 签名字节)。

这是我所做的,但它不起作用:

private void parseIp(String fullData){
   String[] data = fullData.split(":"); // 8099
   String[] ip = data[0].split("\\."); // 77 | 125 | 65 | 201

   for(int i = 0; i < 4; i++){
      System.out.println("---> " + toHex(ip[i]));
   }
}

private String toHex(String data){
   return Integer.toHexString(Integer.parseInt(data, 16));
}
4

6 回答 6

4

Java ti 中有一个特殊的包处理互联网地址 java.net,使用它。

    String s = "77.125.65.201:8099";
    String[] a = s.split(":");
    InetAddress ia = InetAddress.getByName(a[0]);
    byte[] bytes = ia.getAddress();
    int port = Integer.parseInt(a[1]);
于 2013-04-27T15:00:16.320 回答
2
private String parseAddressToHex(String address) {

    int result = 0;
    String[] str = address.split("\\.");
    for (int i = 0; i < str.length; i++) {
        int j = Integer.parseInt(str[i]);
        result = result << 8 | (j & 0xFF);
    }
    return Integer.toHexString(result);
}
于 2016-07-29T07:31:59.643 回答
1

用这个替换你的函数 toHex 。

private String toHex(String data){
   return Integer.toHexString(Integer.parseInt(data));
}
于 2013-04-27T14:43:20.767 回答
1

问题是在这里导致您出现问题的是转换为字节,您实际上根本不需要使用“十六进制”。您真正需要做的就是将 1-3 位十进制数转换为字节,将 1-5 位十进制数转换为一对字节:例如

private byte[] parseIp(String fullData){
   String[] data = fullData.split(":"); 
   String[] ip = data[0].split("\\."); 
   byte[] res = new byte[6];

   for(int i = 0; i < 4; i++){
      res[i] = (byte) Integer.parseInt(ip[i]);
   }
   port = Integer.parseInt(data[1]);
   res[4] = (byte)((port >> 8) & 0xff);
   res[5] = (byte)(port & 0xff);
   return res;
}

(以上需要一些错误检查......)

于 2013-04-27T14:54:23.663 回答
0

您可以使用我从中复制的代码:Convert a string representation of a hex dump to a byte array using Java?

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;
}
于 2013-04-27T14:22:01.910 回答
-1

在让编译器满意之后(win7 上的 java se7u21-x64),你的代码对我来说就像魅力一样。这是独立的 .java 文件:

//
//  27.04.2013 16:26:32
//

public class  ipconvert {
    private static void parseIp(String fullData){
       String[] data = fullData.split(":"); // 8099
       String[] ip = data[0].split("\\."); // 77 | 125 | 65 | 201

       System.out.println();
       System.out.print("---> " + toHex(ip[0]));
       for(int i = 1; i < 4; i++){
          System.out.print("."+toHex(ip[i]));
       }
       System.out.println(":"+data[1]);
    }

    private static String toHex(String data){
       return Integer.toHexString(Integer.parseInt(data, 16));
    }

    public static void main(String[] args) {
        String stest;

        System.out.println("SO tests");
        System.out.println();
        stest = new String("77.125.65.201:8099");
        parseIp ( stest );
        System.out.println();
        return;
    }
}
于 2013-04-27T14:50:55.220 回答