0

我尝试了将十六进制转换为字节的不同方法,代码中有四种方法,其中三种我将其注释掉,只有一种运行时没有错误,但是当我重复运行代码时,我感到困惑,它给了我不同的结果(应该生成“字节”)。

有一个问题是当我使用“method1”时,它给了我结果(字节),但是一旦我改为“method2”,它就不会生成结果,我不知道为什么。当我有相同的字符串时,我认为它应该产生相同的结果。

public class Convert {
/**
 * @param args
 * @throws IOException 
 */

// String everything;

public static void main(String[] args) throws IOException {
    //String everything;
    // TODO Auto-generated method stub
    BufferedReader br = null;
    try {
        br = new BufferedReader(new FileReader("C:\\TEMP1\\Doctor.txt"));
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        StringBuilder sb = new StringBuilder();
        String line = null;
        try {
            line = br.readLine();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        while (line != null) {
            sb.append(line);
            sb.append('\n');
            line = br.readLine();
        }

        //*********Method 1****************
            //String r="1ee079746828d7c6f9af46f93c1ef2555ff4b14b2378ad53a258d18dc6a8363fb57f3448783833722bd9ef291ba53153afca31a96de404755e78f68b76fd5a77e4be3b984ea25244842e92a8ed40da1f1a588fb3da26b8bc21d74cd8476534f26ee454df086567c4d7cf3334f794cede41a9b051a5c393a35584afcf";
            //byte[] b = new BigInteger(r,16).toByteArray();
            //System.out.println("Byte for public key: "+b); 



        //*********Method 2****************
            //String r2 = sb.toString();
            //System.out.println("Doctor contect file: "+r2);
            //byte[] b = new BigInteger(r2,16).toByteArray();
            //System.out.println("Byte for public key: "+b); 

        //********Method 3*****************

            String r="1ee079746828d7c6f9af46f93c1ef2555ff4b14b2378ad53a258d18dc6a8363fb57f3448783833722bd9ef291ba53153afca31a96de404755e78f68b76fd5a77e4be3b984ea25244842e92a8ed40da1f1a588fb3da26b8bc21d74cd8476534f26ee454df086567c4d7cf3334f794cede41a9b051a5c393a35584afcf";  
            int len = r.length();
            byte[] data = new byte[len / 2];
            for (int i = 0; i < len; i += 2) {
                data[i / 2] = (byte) ((Character.digit(r.charAt(i), 16) << 4)
                                 + Character.digit(r.charAt(i+1), 16));
                System.out.println(data);
        }


        //********Method4******************
        /*
            String r2 = sb.toString();
            int len = r2.length();
            byte[] data = new byte[len / 2];
            for (int i = 0; i < len; i += 2) {
                data[i / 2] = (byte) ((Character.digit(r2.charAt(i), 16) << 4)
                                     + Character.digit(r2.charAt(i+1), 16));
                System.out.println(data);
            }
        */






        //String r=everything;

       // String r="1ee079746828d7c6f9af46f93c1ef2555ff4b14b2378ad53a258d18dc6a8363fb57f3448783833722bd9ef291ba53153afca31a96de404755e78f68b76fd5a77e4be3b984ea25244842e92a8ed40da1f1a588fb3da26b8bc21d74cd8476534f26ee454df086567c4d7cf3334f794cede41a9b051a5c393a35584afcf";
       // double convert=Double.parseDouble(r);
       //  long convert=(long)(Integer.parseInt(r,32)&0xFF);
       // byte convert=Byte.parseByte(r,32);
       // byte convert=Integer.parseInt(everything,16);
      // System.out.println("Byte for public key: "+convert);

    } finally {
        br.close();
    }

}

}

4

3 回答 3

3

您正在打印调用toStringa的结果byte[]。那不会给你你想要的。

出于诊断目的,请使用System.out.println(Arrays.toString(data)). 并在循环结束时而不是在循环内执行此操作:

for (int i = 0; i < len; i += 2) {
   ...
}
System.out.println(Arrays.toString(data));

请注意,解析十六进制字符串有很多替代方法。当您不处理 XML 时,我个人不喜欢使用以 XML 为中心的 API(如问题评论中所推荐的那样)的想法,但它肯定会起作用 - 并且任何数量的第三方 API 都有十六进制转换例程。

编辑:如评论中所述,我相信您的十六进制转换代码目前已损坏-但这可能应该通过使用其他地方的预建代码来解决。此答案的主要目的是解释为什么您会得到诸如“[B@40a0dcd9”之类的结果。一旦你可以看到数据,你就可以验证它。

于 2013-09-27T16:44:05.257 回答
0

再次阅读您的问题后,您似乎描述了当您直接使用 String ( method1) 时它可以工作,但如果您从文件 ( method2) 中读取它则不会。

原因很简单:\n在从文件中读取的字符串末尾添加一个。你没有在你的method1.

于 2013-09-27T17:09:02.573 回答
0

我不确定你为什么这样做,所以这个答案可能无法反映你的意图。

我试图理解您的内容并得出结论,您想将该字符串拆分为两个字符块,将它们视为十六进制数字并将它们转换为字节。

那是行不通的,因为第二个块e0Byte.MAX_VALUE. 因此,这是我对您正在寻找的代码的最新猜测(使用整数)。

public static void main(String[] args) {
    String r = "1ee079746828d7c6f9af46f93c1ef2555ff4b14b2378ad53a258d18dc6a8363fb57f3448783833722bd9ef291ba53153afca31a96de404755e78f68b76fd5a77e4be3b984ea25244842e92a8ed40da1f1a588fb3da26b8bc21d74cd8476534f26ee454df086567c4d7cf3334f794cede41a9b051a5c393a35584afcf";
    char[] rA = r.toCharArray();
    int len = r.length();
    int[] data = new int[len / 2];

    for (int i = 0; i < len; i += 2) {
        String base = "#" + rA[i] + rA[i+1];
        System.out.println("base: " + base);
        data[i / 2] = Integer.decode(base);
        System.out.println(data[i/2]);
    }
}
于 2013-09-27T16:56:58.707 回答