【问题标题】:How to base-64 encode a hex string如何对十六进制字符串进行 base-64 编码
【发布时间】:2016-07-19 02:13:18
【问题描述】:

我正在尝试对十六进制字符串进行 base-64 编码(复制如下),但我从 Java8 调用中获得的编码为 base64 的值与我在不同的在线转换器上获得的值不匹配。我想弄清楚我错过了哪些步骤(或我正在采取的失误):

//hexString is 07050600030102
Base64.getEncoder().encodeToString(hexString.getBytes(StandardCharsets.UTF_8));

//output I am getting from Java8 ic copied below:
MDcwNTA2MDAwMzAxMDI=

//online converters:
BwUGAAMBAg==

【问题讨论】:

  • 它将字符数据(不是数值)编码为base64。如果你想要十六进制值,你需要先将其解析为数字。
  • 大多数情况下,您需要解码十六进制并对解码后的内容进行编码,而不是按原样将其编码为 base64。

标签: java hex base64


【解决方案1】:

这并不符合您的预期:

hexString.getBytes(StandardCharsets.UTF_8)

这只是将十六进制字符串编码为 UTF-8 - 您希望 解析 十六进制字符串,以便每对十六进制数字最终成为一个字节。 base64结果不同的事实只是因为你base64编码的字节不同。

要将十六进制字符串解析为字节,您可以使用Guava(以及其他库)

byte[] bytes = BaseEncoding.base16().decode(hexString);
String base64 = BaseEncoding.base64().encode(bytes);

【讨论】:

  • 如果你在一个方向使用BaseEncoding,你不妨同时使用它:BaseEncoding.base64().encode(BaseEncoding.base16().decode(hexString))
  • 谢谢乔恩-我很快就会接受。感谢所有评论的人 - 非常感谢
  • @JonSkeet 如果我将常规字符串(而不是十六进制)转换为 base64,我将在番石榴中使用哪个调用? BaseEncoding.base64().decode() 否则
  • @alihaider:base64 编码的输入是binary 数据,而不是文本......所以它实际上是关于如何将文本转换为二进制数据。有多种方法可以做到这一点。
【解决方案2】:

乔恩的回答是正确的,但我想我会尝试用不同的方式解释它。我认为编码/解码有时会有点混乱。

当您说您的数据被编码为“十六进制字符串”时,该数据就是“可打印的”。事实上,如果要打印二进制数据,“十六进制编码”是您可以对任何二进制数据执行的最简单的操作。使用十六进制编码,没有二进制数据是不可打印的(在我们知道的计算机系统上)!

为了更清楚,假设有人给你一个“十六进制编码”字符串a9(这个想法与你的07050600030102相同)。这意味着当将某个字节流解释为十六进制字符时,它将变为a9。由于每个十六进制字符:[0-9][a-f] 可以编码为一个半字节00001111,因此您可以将实际位解码为:1010 1001(为简洁起见,使用空白)。所以,十六进制编码为a9 实际上是一个字节10101001

所以,如果您现在要对其进行“base64 编码”,您应该使用10101001 作为输入!就字节数组而言,这将是:{-87},因为-87 是位序列10101001 在 Java 中整数值的二进制补码表示中的十进制值。

当您这样做时:hexString.getBytes(StandardCharsets.UTF_8)hexString.getBytes()(如果您的计算机上的默认字符集是 UTF-8),那么您将根据 UTF-8 编码获得 hexString 的字节和由于该编码与 ASCII 编码向后兼容,因此您将得到一个 2 字节数组,其中第一个字节是十进制 97(或二进制 01100001),表示字符 'a',第二个字节字节是十进制57,(或二进制00111001)代表字符'9'(十进制9)。因此,您将从getBytes() 调用中获得的字节数组是:{97, 57}

如您所见,这两个是两个不同的东西。您想要对数组{-87} 表示的字节进行base64 编码,但最终会得到数组{97, 57} 表示的base64 编码字节。

【讨论】:

    猜你喜欢
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 2021-09-30
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2014-03-10
    相关资源
    最近更新 更多