代码之家  ›  专栏  ›  技术社区  ›  Fueled By Coffee

如何将BigInteger字符串转换为ASCII字符串?

  •  0
  • Fueled By Coffee  · 技术社区  · 7 年前

    我有两个逆函数:

    public static BigInteger stringToBig(String message) {      
        StringBuilder sb = new StringBuilder();
        for (char c : message.toCharArray()) {
            sb.append((int)c);
        }
    
        return new BigInteger(sb.toString());
    }
    
    public static String bigStringToString(String string) {
        StringBuilder result = new StringBuilder();
        for (int x = (string.length() % 3 - 3) % 3; x < string.length(); x += 3) {
            int chr = Integer.parseInt(string.substring(Math.max(x, 0), x + 3));
            result.append(Character.toString((char) (chr)));
        }
        return result.toString();
    }
    

    我的目标是从

    “这是我的信息”

    将其转换为 "8410410511532105115321091213210910111511597103101"

    然后把它转换回 "This is my message"

    我试过以下方法,但是 "????is?[ÕÒ?o??ge" 作为输出返回 bigStringToString

    String text = String.valueOf(stringToBig("This is my message"));
    System.out.println(text);
    System.out.println(bigStringToString(text));
    

    我的转换回来有什么问题?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Elliott Frisch    7 年前

    您当前的转换不可逆,而是可以使用 byte[] String.getBytes() 直接。别忘了指定编码。比如,

    String s = "This is my message";
    try {
        byte[] enc = s.getBytes("UTF-8");
        BigInteger val = new BigInteger(enc);
        System.out.println(val);
        System.out.println(new String(val.toByteArray(), "UTF-8"));
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    

    输出

    7352961551138726160548009928799764296591205
    This is my message
    
        2
  •  2
  •   Sean F    7 年前

    正如其他人所指出的,您不需要考虑整数的不同长度。由于您假定所有字符都是ASCII字符,并且长度为3,因此在为biginteger构造字符串时可以使用此参数:

     sb.append(String.format("%03d", (int) c));