【问题标题】:String to hexadecimal字符串转十六进制
【发布时间】:2013-04-27 14:11:54
【问题描述】:

我需要一种将字符串“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));
}

【问题讨论】:

  • 一个 Java 字节可以存储 -128 到 127。如果我们将它们解释为无符号,我们可以存储 0 到 255。没有办法将 8099 存储在单个字节中。
  • 在您的原始字符串中是77 十进制还是十六进制值?
  • 当您说您的代码“不起作用”时,它实际上是什么意思?你有任何错误吗?你没有得到预期的结果吗?请将所有详细信息添加到您的帖子中。

标签: java string format ip hex


【解决方案1】:

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]);

【讨论】:

    【解决方案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);
    }
    

    【讨论】:

      【解决方案3】:

      用这个替换你的函数 toHex。

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

      【讨论】:

      • 唯一的问题是它将“1”转换为“1”而不是“01”
      【解决方案4】:

      导致您出现问题的是转换为字节,您实际上根本不需要使用“十六进制”。您真正需要做的就是将 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;
      }
      

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

      【讨论】:

        【解决方案5】:

        您可以使用我从以下位置复制的代码: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;
        }
        

        【讨论】:

          【解决方案6】:

          在使编译器满意之后,您的代码对我来说就像魅力一样(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;
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-01-31
            • 2012-08-15
            • 2017-03-22
            • 1970-01-01
            • 2019-07-27
            • 2018-01-22
            • 2013-09-20
            • 1970-01-01
            相关资源
            最近更新 更多