Java 使用大字符串将十六进制转换为字节

Java 使用大字符串将十六进制转换为字节,java,byte,Java,Byte,我尝试了不同的方法将十六进制转换为字节,代码中有四个方法,其中三个我注释掉了,只有一个在运行时没有错误,但我混淆了,当我重复运行代码时,它给了我不同的结果(应该是生成“字节”) 有一个问题是,当我使用“method1”时,它给了我结果(字节),但一旦我更改为“method2”,它将不会生成结果,我不知道为什么。我认为当我有相同的字符串时,它应该生成相同的结果 public class Convert { /** * @param args * @throws IOException */

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

有一个问题是,当我使用“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();
    }

}
公共类转换{
/**
*@param args
*@抛出异常
*/
//把一切都串起来;
公共静态void main(字符串[]args)引发IOException{
//把一切都串起来;
//TODO自动生成的方法存根
BufferedReader br=null;
试一试{
br=新的BufferedReader(新的文件读取器(“C:\\TEMP1\\Doctor.txt”);
}catch(filenotfounde异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
试一试{
StringBuilder sb=新的StringBuilder();
字符串行=null;
试一试{
line=br.readLine();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
while(行!=null){
某人附加(行);
sb.追加('\n');
line=br.readLine();
}
//*********方法1****************
//字符串r=“1EE079746828D7C6F9AF46F93C1EF2555FF4B14B2378AD53A258D18DC6A8363FB57F34487833722BD9EF291BA531533AFCA3196DE404755E78F68B76FD5A77E4BE984EA25244842E92A8ED40DA1F1A5588FB3DA26BC21D74CD84534F26EE454DF08567C4D3334F794CEDA41A9B051A593A384AF8CF”;
//byte[]b=新的BigInteger(r,16).toByteArray();
//System.out.println(“公钥字节:+b”);
//*********方法2****************
//字符串r2=sb.toString();
//System.out.println(“医生上下文文件:“+r2”);
//字节[]b=新的BigInteger(r2,16).toByteArray();
//System.out.println(“公钥字节:+b”);
//********方法3*****************
字符串r=“1EE079746828D7C6F9AF46F93C1EF2555FF4B14B2378AD53A258D18DC6A8363FB57F34487833722BD9EF291BA531533AFCA3196DE404755E78F68B76FD5A77E4BE984EA25244842E92A8ED40DA1F1A5588FB3DA26BC21D74CD84534F26EE454DF08567C4D3334F794CEDA41A9B051A593A384AF8CF”;
int len=r.length();
字节[]数据=新字节[len/2];
对于(int i=0;i数据[i/2]=(字节)((Character.digit(r.charAt(i),16)您正在打印调用
toString
的结果,该结果位于
byte[]
上。这并不能满足您的需要

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

for (int i = 0; i < len; i += 2) {
   ...
}
System.out.println(Arrays.toString(data));
for(int i=0;i
请注意,解析十六进制字符串有很多替代方法。我个人不喜欢在不处理XML时使用以XML为中心的API(如问题注释中所建议的),但它肯定会起作用——而且任何数量的第三方API都有十六进制转换例程


编辑:如评论中所述,我相信您的十六进制转换代码目前也被破坏了-但这可能应该通过使用其他地方的预构建代码来修复。这个答案的主要目的是解释为什么您会得到如下结果:[B@40a0dcd9"。一旦您可以看到数据,就可以对其进行验证。

您正在打印调用
toString
的结果,该结果位于
字节[]
上。这并不能满足您的需要

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

for (int i = 0; i < len; i += 2) {
   ...
}
System.out.println(Arrays.toString(data));
for(int i=0;i
请注意,解析十六进制字符串有很多替代方法。我个人不喜欢在不处理XML时使用以XML为中心的API(如问题注释中所建议的),但它肯定会起作用——而且任何数量的第三方API都有十六进制转换例程


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

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

我试图理解你的东西,并得出结论,你想把这个字符串分成两个字符块,把它们当作十六进制数,然后把它们转换成一个字节

这是行不通的,因为第二个块
e0
Byte.MAX\u VALUE
大。因此,下面是我对您要查找的代码的最新猜测(使用整数)

publicstaticvoidmain(字符串[]args){
字符串r=“1EE079746828D7C6F9AF46F93C1EF2555FF4B14B2378AD53A258D18DC6A8363FB57F34487833722BD9EF291BA531533AFCA3196DE404755E78F68B76FD5A77E4BE984EA25244842E92A8ED40DA1F1A5588FB3DA26BC21D74CD84534F26EE454DF08567C4D3334F794CEDA41A9B051A593A384AF8CF”;
char[]rA=r.toCharArray();
int len=r.length();
int[]数据=新的int[len/2];
对于(int i=0;i
我不确定你为什么这么做,所以这个答案可能无法反映你的意图

我试着理解你的东西,得出结论,你想把这个字符串分成两个字符块,把它们当作十六进制数