2013-04-27 191 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); 
}