0

16 進数をバイトに変換するさまざまな方法を試しました。コードには 4 つの方法があり、そのうちの 3 つをコメントアウトします。実行時にエラーが発生しないのは 1 つだけですが、コードの実行を繰り返したときに混乱しました。それは私に別の結果を与えました(「バイト」を生成する必要があります)。

「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

を呼び出した結果を出力toStringしていbyte[]ます。それはあなたが望むものを与えるつもりはありません。

診断目的で使用しますSystem.out.println(Arrays.toString(data))。そして、ループ内ではなくループの最後でそれを行います。

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

16 進文字列を解析するための代替アプローチはたくさんあります。個人的には、XML を扱っていないときに (質問のコメントで推奨されているように) XML に焦点を当てた API を使用するという考えは好きではありませんが、それは確かに機能します。

編集: コメントに記載されているように、現時点では 16 進変換コード壊れていると思いますが、他の場所からビルド済みのものを使用して修正する必要があります。この回答の主な目的は、「[B@40a0dcd9」などの結果が得られる理由を説明することでした。データが表示されたら、それを確認できます。

于 2013-09-27T16:44:05.257 に答える
0

なぜそうするのかわからないので、この答えはあなたの意図を反映していないかもしれません。

私はあなたのものを理解しようとしましたが、その文字列を2つの文字ブロックに分割し、それらを16進数として扱い、それらをバイトに変換したいという結論に達しました.

2 番目のブロックe0が より大きいため、これは機能しませんByte.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 に答える