java - 如何将 long 转换为可打印字节

标签 java encoding

我有一个代表长整型的字符串。如“12345678901”(11 个字符长)。

我使用Long.parse()将其转换为long,这样就可以了。

现在,我想将这个长字符串作为短字符串发送,例如通过网络发送"eR%s"

目标是使最终字符串尽可能短。知道最好的方法是什么吗?我可以使用更多字符作为 URL 编码(就像我可以使用/、%、: 等)

最佳答案

Java 可以使用数字 0 - 9 和小写字母 a - z 处理高达 36 的基数。

> Long.toString(12345678901L, 36)
"5o6aqt1"

> Long.parseLong("5o6aqt1", 36)
12345678901

您可以使用 66 个未保留 URI 字符中的 65 个创建您自己的编码(因此您的 URI 不需要转义)。负数需要使用“-”号:

> Long65.toString(12345678901L)
"aFDIbA"

> Long65.parseLong65("aFDIbA")
12345678901

这是Long65()的代码

import java.math.BigInteger;

public class Long65 {
    private static int base = 65;
    private static String URIchars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_.~";

    public static String toString(Long aNumber) {
        StringBuilder result = new StringBuilder();
        if (aNumber < 0) {
            result.append('-');
            aNumber = -aNumber;
        }
        int r = (int)(aNumber % base);
        if (aNumber - r == 0) 
            result.append(URIchars.charAt(r));
        else 
            result.append(Long65.toString((aNumber - r) / base) + URIchars.charAt(r));
        return result.toString();
    }

    public static long parseLong65(String aNumber) {
        char[] digits;
        int sign = 1;
        if (aNumber.charAt(0) == '-') {
            sign = -1;
            digits = aNumber.substring(1).toCharArray();
        } else {
            digits = aNumber.toCharArray();
        }
        BigInteger bigBase = BigInteger.valueOf(base);
        BigInteger power = bigBase.pow(digits.length);
        BigInteger total = BigInteger.valueOf(0);
        for (char digit : digits){
            power = power.divide(bigBase);
            total = total.add(power.multiply(BigInteger.valueOf(URIchars.indexOf(digit))));
        }
        return sign * total.longValue();
    }
}

关于java - 如何将 long 转换为可打印字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20385369/

相关文章:

.net - 如何检测文件的使用权限 (DRM)

java - Google Sheet API V4(Java) 在单元格中附加日期

java - Hibernate引入二级缓存如何解决N+1问题?

Swift Struct 是 Codable 但不能编码

java - 如何反转字节数组中的 UTF-8 编码?

python - 如何打印变量中包含的 unicode 字符串的值

java - 打开 jdialog 后更新 jlabel 文本

java - 当 Jbutton 收到鼠标点击时显示 Jdialog 框

java - 可选<>和返回类型缩小

python - 如何从 python 脚本中获取终端的编码?