[英]Convert Hex to Byte with big string
我尝试了不同的方式将十六进制转换为字节,代码中有4种方法,其中的3种我将其注释掉,只有一种方法在运行时没有错误,但是当我重复运行代码时,我感到困惑,它给了我不同的结果(应该生成“字节”)。
有一个问题是,当我使用“ 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();
}
}
}
您正在在byte[]
上打印调用toString
的结果。 那不会给你你想要的。
为了进行诊断,请使用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””之类的结果。 一旦看到数据,就可以对其进行验证。
我不确定您为什么这样做,因此此答案可能无法反映您的意图。
我试图理解您的内容,并得出结论,您想要将该字符串分成两个字符块,将它们视为十六进制数字并将其转换为字节。
那将行不通,因为第二个块e0
大于Byte.MAX_VALUE
。 因此,这是我对您正在寻找的代码(使用Integer)的最新猜测。
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]);
}
}
再次阅读问题后,似乎可以描述为直接使用String( method1
)时有效,但是如果从文件( method2
)读取则不行。
原因很简单:您在从文件读取的字符串的末尾添加一个\\n
。 您不会在method1
这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.