无法在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
相关产品推荐
相关产品推荐

