0

大家好,我目前正在使用 android 中的 DH 密钥交换做一个客户端服务器应用程序。我在客户端将字符串转换为 long 时遇到问题,奇怪的是转换对前 2 个变量 pValue 和 gValue 有效。但是,当我想从服务器发送它时转换服务器的公钥时。我得到一个数字格式异常:invalid long。我很确定发送过来的数字是数字而不是字母,因为我将它们打印成字符串。服务器将 gValue:pValue:PK 一起发送,由 a 分隔:

下面是我的客户端代码片段。

try {

   response = SimpleHttpClient.executeHttpGet("http://10.0.2.2:8000/MyServletProject/DHServlet");
   String res = response.toString(); 

   String  [] ar = res.split(":");
   String primeValue = ar[0];
   String genValue = ar[1];
   String pkSValue = ar[2];
   System.out.println(pkSValue);
   long convertPValue = Long.parseLong(primeValue);
   long convertGValue = Long.parseLong(genValue);
   long convertSValue = Long.parseLong(pkSValue);
   //BigInteger biPK;
   // biPK = new BigInteger(pkSValue);
   //System.out.println(convertPKValue);
   long skB=getDH.generateSKB();

   BigInteger bi1,bi2,bi3,sKey,biSK;

   bi1=BigInteger.valueOf(convertGValue);
   bi2=BigInteger.valueOf(convertPValue);
   bi3=getDH.generatePkB(bi1, bi2, skB);
   biSK = BigInteger.valueOf(skB);
   //biPK= new BigInteger(pkSValue);
   String PKClient = bi3.toString();
   System.out.println("The public key is "+PKClient);
   System.out.println("The generator value is "+bi1);
   System.out.println("The prime value is "+bi2);

日志猫

07-12 12:24:33.459: I/System.out(2387): 4126158 
07-12 12:24:33.459: W/System.err(2387): java.lang.NumberFormatException: Invalid long: "4126158 
07-12 12:24:33.479: W/System.err(2387): "
07-12 12:24:33.489: W/System.err(2387):     at java.lang.Long.invalidLong(Long.java:125)
07-12 12:24:33.499: W/System.err(2387):     at java.lang.Long.parse(Long.java:362)
07-12 12:24:33.499: W/System.err(2387):     at java.lang.Long.parseLong(Long.java:353)
07-12 12:24:33.529: W/System.err(2387):     at java.lang.Long.parseLong(Long.java:319)
07-12 12:24:33.529: W/System.err(2387):     at com.example.firstapp.clientside.LoginLayout$1$1.run(LoginLayout.java:70)
07-12 12:24:33.549: W/System.err(2387):     at java.lang.Thread.run(Thread.java:856)
07-12 12:25:55.460: W/IInputConnectionWrapper(2387): showStatusIcon on inactive InputConnection
07-12 12:28:54.453: I/System.out(2437): java.lang.NumberFormatException: Invalid long: "2810970 

我真的很难过,希望你们能帮助我。提前致谢!

4

5 回答 5

3

从这条线

07-12 12:24:33.459: I/System.out(2387): 4126158 

看起来你的末尾有一个空格4126158

您可以使用 java.lang.String.trim() 在尝试将字符串解析为Long.

于 2013-07-12T12:49:26.350 回答
1

看起来您的字符串中有回车符/换行符,这会导致解析失败。

您可以尝试先对数据进行清理,如下所示:

try {
    primeValue = primeValue.trim();
    long convertPValue = Long.parseLong(primeValue);
}
catch (NumberFormatException nfe) {
    nfe.printStackTrace()
}

此外,您确实应该通过尝试捕获异常来检查这些错误。

如果您拥有服务器,您还可以查看相应地更改输出,但您仍然应该假设客户端得到的任何东西都可能是垃圾并且优雅地失败:)

于 2013-07-12T12:45:12.583 回答
0

返回的值是"4126158并且"是多余的,因此编译器无法将该值转换为数字类型

于 2013-07-12T12:45:03.097 回答
0
07-12 12:24:33.459: W/System.err(2387): java.lang.NumberFormatException: Invalid long: "4126158 
07-12 12:24:33.479: W/System.err(2387): "

您的字符串中有一个换行符。确保您的服务器不会在末尾发送带有换行符的字符串。

于 2013-07-12T12:45:44.350 回答
0

没有更多细节很难回答,但字符串末尾可能有一些空格/换行符?尝试

pkSValue = pkSValue.trim().replaceAll("(\\r|\\n)", "");
于 2013-07-12T12:48:35.063 回答