如何将下一个字符对转换为十六进制整数

时间:2014-05-03 06:36:26

标签: java

我必须首先反转两个字节,然后将该对转换为十六进制整数。我试图像下面那样转换它,但它给出了错误。有没有想过这样做?提前致谢

这里有完整的字符串:http://pastebin.com/1cSCyD78

示例字符串

String str = "031890";

错误讯息:

java.lang.NumberFormatException: Invalid int: "0x30"

Java代码

for ( int start = 0; start < str.length(); start += 2 ) {
    try {
        String thisByte = new StringBuilder(str.substring(start, start+2)).reverse().toString();
        thisByte = "0x" + thisByte;
        int value = Integer.parseInt(thisByte, 16);
        char c = (char) value;
        System.out.println(c);
    } catch(Exception e) {
        Log.e("MainActivity", e.getMessage());
    }
}

更新

StringBuilder output = new StringBuilder();
for ( int start = 0; start < str.length(); start += 2 ) {
    try {
        String thisByte = new StringBuilder(str.substring(start, start+2)).reverse().toString();
        output.append((char)Integer.parseInt(thisByte, 16));
    } catch(Exception e) {
        Log.e("MainActivity", e.getMessage());
    }
}

是的我尝试没有预先添加&#34; 0x&#34;到字符串,现在看到我的输出看起来很奇怪。

enter image description here

2 个答案:

答案 0 :(得分:2)

尝试不预先添加&#34; 0x&#34;到字符串。此前缀仅适用于编译器。它实际上是说使用16作为基数的捷径。

答案 1 :(得分:2)

您的字符串看起来每个字符的字符串需要4个数字,而不是2个。

鉴于您将2位数字解释为一个字符,乍一看,您在图片中显示的输出似乎与您在pastebin上发布的字符串相匹配。你确实得到了输出中看起来像单词的东西,所以它并没有完全关闭,而且字母之间的间隙来自每两对2位数字,即“00&#39;”

不确定此字符串的来源,但如果它也是通过将某些字符串中的字符转换为字节而生成的,那么每个字符的4位数字可能是有意义的,因为例如Java&#39; s char是16位(即2个字节,即字符串中的4个数字),用于编码它们在UTF-16中表示的实际unicode符号。

如果您正在处理其他人为您提供的规格,也许当他们说&#34; 2 BYTES&#34;时,他们实际上意味着&#34;两个8位数字&#34;,它们对应于4十六进制字符串中的数字(四个4位半字节)。

但是你的字符串看起来也包含二进制数据,而不仅仅是字符。你知道你真正希望看到什么作为答案吗?

更新(根据评论请求)

这对您的代码进行了微不足道的更改,但现在是:

StringBuilder output = new StringBuilder();
for ( int start = 0; start < str.length(); start += 4 ) {
    try {
        String thisByte = new StringBuilder(str.substring(start, start+4)).reverse().toString();
        output.append((char)Integer.parseInt(thisByte, 16));
    } catch(Exception e) {
        Log.e("MainActivity", e.getMessage());
    }
}

我所做的就是替换&#34; 2&#34;用&#34; 4&#34;。 :)

更新(根据聊天情况)

此处发布的将十六进制字符串转换为字符(每个字符使用4位数字)的代码似乎工作正常,但十六进制字符串似乎不符合OP期望的基于数据规范的约定,这引起了一些混乱。

附注

如果这是一个公共应用程序,则在网络流量中包含未加密的SQL语句是非常危险的。如果这些语句是请求的一部分并在服务器上执行,则黑客可以使用它来对基础数据执行不必要的操作(例如,窃取数据库中的所有电话号码)。如果只是发送给客户端的一些调试/日志信息,它仍然不是一个好主意,因为它可能会给黑客提供有关数据库结构和访问方式的提示,从而大大简化了潜在的SQL injection attack