You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法在ByteArray与String间正确转换:UUID字节数组长度异常问题

解决二进制UUID存入JsonArray后转字符串字节长度变化的问题

嘿,我懂你遇到的这个糟心事——把16字节的UUID二进制数组放进JsonArray,再用getString(0)取出来转成字节数组就变成24字节了,换了各种字符集都没用对吧?

问题根源

核心问题在于二进制数据不能直接当成字符串来存储和转换。你生成的16字节UUID是纯二进制内容,其中很多字节值并不符合UTF-8(或任何常见字符集)的编码规则。当你把byte数组直接添加到JsonArray时,底层会尝试把它按默认字符集转成字符串,但无效的字节会被替换成通用替代字符�(U+FFFD)。这个字符在UTF-8里占3个字节,所以当你再把字符串转回字节数组时,原本的二进制信息已经丢失,长度自然就变了。

解决方案:用Base64编码中转

正确的做法是把二进制数据转换成Base64编码的字符串(这是专门用来安全传输/存储二进制数据的字符串格式),存入JsonArray后,取出时再解码回字节数组。这样既能保证数据完整,也符合JSON只能存储字符串、数字等类型的规则。

修改后的代码示例:

import java.util.UUID;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.Base64;
import javax.json.JsonArray;
import javax.json.JsonArrayBuilder;
import javax.json.Json;

public class UUIDToolBox {
    public static void main(String[] args) {
        byte[] uuid = fromUUIDToBytes(UUID.randomUUID());
        System.out.println("uuid byteArray = " + Arrays.toString(uuid) + ", length:" + uuid.length );
        
        // 将二进制UUID转成Base64字符串存入JsonArray
        String base64Uuid = Base64.getEncoder().encodeToString(uuid);
        JsonArray j = Json.createArrayBuilder().add(base64Uuid).build();
        
        // 取出Base64字符串并解码回原字节数组
        String retrievedStr = j.getString(0);
        byte[] n = Base64.getDecoder().decode(retrievedStr);
        System.out.println("from Base64 String = " + Arrays.toString(n) + ", length:" + n.length);
    }

    public static byte[] fromUUIDToBytes(UUID uuid) {
        ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
        bb.putLong(uuid.getMostSignificantBits());
        bb.putLong(uuid.getLeastSignificantBits());
        return bb.array();
    }
}

运行这段代码你会发现,解码后的字节数组长度回到了16,而且内容和原UUID二进制数组完全一致。

额外提示

如果你的项目使用Jackson、Gson这类更常用的JSON库,它们本身就支持直接序列化/反序列化字节数组,内部会自动用Base64处理,不需要你手动编码解码,会更省心哦。

内容的提问来源于stack exchange,提问作者Anum Sheraz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:44:00