【问题标题】:I wanted to Convert any length String to fixed 32 Bytes我想将任何长度的字符串转换为固定的 32 字节
【发布时间】:2018-11-14 16:26:19
【问题描述】:

我想在 Java 中将任意长度的 String 转换为 byte32。

代码

String s="9c46267273a4999031c1d0f7e40b2a59233ce59427c4b9678d6c3a4de49b6052e71f6325296c4bddf71ea9e00da4e88c4d4fcbf241859d6aeb41e1714a0e";

//Convert into byte32

【问题讨论】:

  • 什么是'byte32'?
  • 您不能以无损的方式将任意大的数据精确地放入 32 个字节中,这根本不可能。你想要一个哈希还是你的输入以某种方式受到限制?例如,您显示的示例输入似乎是 124 个字符的十六进制字符串。会一直这样吗?
  • 您介意向我们展示预期的输出吗?你想要"9c46267273a4999031c1d0f7e40b2a59" 作为结果吗?或"œF&rs¤™.1ÁÐ÷ä.*Y""œF&rs¤™.1ÁÐ÷ä.*Y#<å”'Ĺg.l:Mä›'R"
  • 听起来你甚至不确定自己在做什么,所以看在上帝的份上,不要乱搞 Crypto!

标签: java algorithm ethereum


【解决方案1】:

从 cmets 中可以看出,您希望将该字符串的存储空间减少到 32 个字节。

通过进行十六进制转换,可以轻松地将给定的字符串从 124 字节压缩到 62 字节。

但是,没有算法,也不会有可以将任何数据压缩到 32 字节的算法。想象一下这将是可能的:它已经实现了,您将能够为您压缩的任何文件获取仅 32 字节的 ZIP 文件。

所以,很遗憾,答案是:不可能。

【讨论】:

    【解决方案2】:

    您不能将 任何 长度的字符串转换为长度为 32 的字节数组。

    Java 使用 UTF-16 作为它的字符串编码,所以为了将 100% 的字符串 1:1 存储为一个固定长度的字节数组,你会乍一看被限制为 16 个字符。

    如果你愿意接受 16 个字符的限制,byte[] bytes = s.getBytes();应该给你一个 variable 长度的字节数组,但最好指定一个明确的编码。例如byte [] array2 = str.getBytes("UTF-16");

    这并不能完全解决您的问题。您现在可能必须检查字节数组是否不超过 32 个字节,并提出填充策略、可能的 null 终止(这可能会消耗您的字符预算)

    现在,如果您不需要 Java 默认为字符串使用的整个 UTF-16 字符串空间,您可以使用其他编码来摆脱更长的字符串。

    如果这是用于任何其他标准或其他东西(我看到有人提到以太坊),那么您将需要遵循他们的标准。

    除非您正在编写自己的库来直接处理它,否则我强烈建议您使用已经存在并且似乎经过良好测试和使用的库。

    【讨论】:

      【解决方案3】:

      可以通过以下功能实现

      byte[] bytes = s.getBytes();
      

      【讨论】:

      • 我希望字节的长度为 32。
      • @PriyankaKanse 你说的 32 是什么意思? byte 由八位组成。
      • 我想在给定的字符串中转换成字节,然后再转换成固定长度为 32 的字符串。
      • 您的字符串太长。除非它使用已知字符(可能是十六进制或 base64)编码,否则它甚至不适合 32 个字节。
      猜你喜欢
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 2017-10-07
      • 2014-12-15
      • 1970-01-01
      • 1970-01-01
      • 2020-01-03
      相关资源
      最近更新 更多