【问题标题】:Java convert bytes to binary safe stringJava将字节转换为二进制安全字符串
【发布时间】:2013-01-04 04:42:27
【问题描述】:

我有一些以字节为单位的数据,我想把它们放到 Redis 中,但是 Redis 只接受二进制安全字符串,而我的数据有一些二进制非安全字节。那么如何将这些字节转换为二进制安全字符串,以便将它们保存到 Redis 中呢?

Base64 对我有用,但它使数据更大,有更好的主意吗?

更新:我想将我的protobuf对象序列化为Redis,并且序列化的数据有'\x00',所以当我从Redis读取数据时,我无法将数据反序列化为对象。然后我尝试了base64,它工作正常,但尺寸更大。

所以我想弄清楚如何以更小的尺寸安全地将二进制数据(protobuf 对象)序列化到 Redis

【问题讨论】:

  • 你有确切什么是“二进制安全字符串”的详细信息吗?这不是一个标准术语。
  • Reading this,看来对于Redis来说,二进制安全只是意味着Redis不会改变内容。除非我遗漏了什么(很可能,因为我以前没有使用过 Redis),否则您不需要对数据做任何事情。
  • @Pablo 我已经更新了我的问题以了解更多详情
  • @JonSkeet 我已经更新了我的问题以了解更多详情
  • @MartinLuo:您的编辑没有提供有关“二进制安全字符串”含义的更多信息。

标签: java redis binary-data


【解决方案1】:

您可以尝试 ISO-8859-1 编码。这使用字节和字符之间的一对一映射。

这仍然可能导致损坏,具体取决于 Redis 需要此“二进制安全”字符串的原因。您可能必须使用 base64。

【讨论】:

  • 我想找到一种尺寸更小的方法,base64现在适合我,但我认为它不够好
  • 如果使用ISO-8859-1 有效,您可能会发现它不会增加大小。 Base64 将 3 个字节转换为 4 个字符,这会将 1 个字节转换为 1 个字符(反之亦然)
【解决方案2】:

序列化二进制对象(例如 protobuf 对象)的唯一安全方法是对其进行 base64 编码。 Base64 有 33% 的开销,但让您能够安全地将任意二进制数据转换为文本(例如用于 xml 文件)并返回。

【讨论】:

  • 33% 的开销还是 166% 的开销?在很多环境下,每三个字节的数据变成会变成四个两个字节的字符,即总共8个字节?
猜你喜欢
  • 1970-01-01
  • 2014-05-10
  • 2015-06-21
  • 2014-10-24
  • 2021-12-20
  • 2013-07-17
  • 2019-03-14
  • 2013-01-30
相关资源
最近更新 更多