gpt4 book ai didi

java - 简单的java算法对以下字符串进行编码/解码

转载 作者:行者123 更新时间:2023-11-30 05:00:29 24 4
gpt4 key购买 nike

假设我有
字符串输入 = "1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2 ,3,0,4,0,0,0,4,0,3";我想将其编码为字符较少的字符串,并通过用罗马字符 IE 表示来实际上隐藏实际信息。上面的代码编码为 "Adqwqkjlhs" 之类的内容。如果给定编码字符串,则必须能够解码为原始字符串。

字符串输入实际上是我从 URL 的哈希值中解析出来的内容,但原始格式很长并且易于操作。

有什么想法吗?

谢谢

编辑#1
数字可以是 0 到 99,每个数字之间用逗号分隔,用于 String.split(",") 检索 String[]

编辑#2(编码字符串的用途)
假设上面的字符串编码为 bmtwva1131gpefvb1xv,那么我可以得到像 www.shortstring.com/input#bmtwva1131gpefvb1xv 这样的 URL 链接。从那里我会将 bmtwva1131gpefvb1xv 解码为逗号分隔的数字。

最佳答案

与 Nathan Hughes 的解决方案相比,这并不是真正的改进,但字符串越长,节省的成本就越多。

编码:创建一个以“1”开头的字符串,使源字符串中的每个数字都是2位数字,因此“0”变成“00”,“5”变成“05”,“99”变成“99”等。以 36 为基数表示结果数字。

解码:将基数为 36 的数字/字符串,改回基数为 10,跳过第一个“1”,然后将每 2 个数字/字母转为 int,并重建原始字符串。

示例代码:

    String s = "1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,3,0,4,0,0,0,4,0,3";

// ENCODE the string
StringTokenizer tokenizer = new StringTokenizer(s,",");
StringBuilder b = new StringBuilder();
b.append("1"); // This is a primer character, in case we end up with a bunch of zeroes at the beginning
while(tokenizer.hasMoreTokens()) {
String token = tokenizer.nextToken().trim();
if(token.length()==1) {
b.append("0");
b.append(token);
}
else {
b.append(token);
}
}

System.out.println(b);
// We get this String: 101020000000000000000000000000000000000010202030004000000040003

String encoded = (new BigInteger(b.toString())).toString(36);
System.out.println(encoded);
// We get this String: kcocwisb8v46v8lbqjw0n3oaad49dkfdbc5zl9vn


// DECODE the string

String decoded = (new BigInteger(encoded, 36)).toString();
System.out.println(decoded);
// We should get this String: 101020000000000000000000000000000000000010202030004000000040003

StringBuilder p = new StringBuilder();
int index = 1; // we skip the first "1", it was our primer
while(index<decoded.length()) {
if(index>1) {
p.append(",");
}
p.append(Integer.parseInt(decoded.substring(index,index+2)));
index = index+2;
}

System.out.println(p);
// We should get this String: 1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,3,0,4,0,0,0,4,0,3

我不知道有什么简单的方法可以将大量数字转换为基数 64。仔细选择的符号(例如 +、、-)可以进行 URL 编码,因此 0-9、a-z、A-Z、使用“”和“-”得到 64。BigInteger.toString() 方法仅占用 Character.MAX_RADIX,即 36(没有大写字母)。如果你能找到一种方法,将一个大数字改为以 64 为基数,那么生成的编码字符串将会更短。

编辑:看起来这对你来说是这样的:http://commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Base64.html

关于java - 简单的java算法对以下字符串进行编码/解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6893299/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com