2013-04-27 141 views
1

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

例IP:

77.125.65.201:8099

我不能使用 “” .getBytes();因为我需要下面的格式(无点和结肠):

[#1个八位字节的ip] [#2个八位字节的ip] [#3个八比特组的ip] [#4八位位组的ip] [#1 2个八位位组的端口]

为了更好地理解:

在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)); 
} 
+0

一个Java字节可以存储从-128到127,如果我们的解释是他们无符号,我们可以存储0到255之间有没有办法来存储8099在一个字节。 – jlordo 2013-04-27 14:23:17

+0

在你的原始字符串中是“77”十进制还是十六进制值? – 2013-04-27 14:26:05

+0

当你说你的代码“*不工作*”时,它实际上意味着什么?你有什么错误吗?你没有得到预期的结果吗?请在您的帖子中添加所有详细信息。 – 2013-04-27 14:35:12

回答

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; 
} 
1

与此更换你的函数toHex。

private String toHex(String data){ 
    return Integer.toHexString(Integer.parseInt(data)); 
} 
+0

与此唯一的问题是它将'1'转换为'1'而不是'01' – Zapnologica 2013-06-18 12:09:31

-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; 
    } 
} 
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; 
} 

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

3

有一个特殊的包在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]); 
1
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); 
}