JavaL不同的Big Decimal值转换为UTF-8字符串具有相同的值
JavaL Different Big Decimal values converted to UTF-8 Strings have the same value
在玩 Avro 的过程中,我发现了以下内容:
new String(new BigDecimal("1.28").unscaledValue().toByteArray(), Charset.forName("UTF-8"))
.equals(
new String(new BigDecimal("1.29").unscaledValue().toByteArray(), Charset.forName("UTF-8")))
-> true !!!!!!!!
DatatypeConverter.printBase64Binary(new BigDecimal("1.28").unscaledValue().toByteArray())
.equals(
DatatypeConverter.printBase64Binary(new BigDecimal("1.29").unscaledValue().toByteArray()))
-> false (as expected)
但是
new String(new BigDecimal("1.26").unscaledValue().toByteArray(), Charset.forName("UTF-8"))
.equals(
new String(new BigDecimal("1.27").unscaledValue().toByteArray(), Charset.forName("UTF-8")))
-> false (as expected)
谁能给我解释一下这是怎么回事?似乎 1.27 是截止点。
理想情况下,我需要
new String(new BigDecimal("1.28").unscaledValue().toByteArray(), Charset.forName("UTF-8"))
适用于每个 BigDecimal 值。
Can someone explain to me what is going on?
是的,您在滥用数据。 BigDecimal.toByteArray()
的结果 不是 字符串的 UTF-8 编码表示形式,因此您不应尝试以这种方式将其转换为字符串。
一些 不同的字节数组可能 "decoded" 通过 UTF-8 到字符串一样,如果它们基本上是无效的。如果您查看 new BigDecimal("1.28").unscaledValue().toByteArray()
的结果以及 1.29 的结果,您会发现它们无效,因此都解码为包含“?”的字符串。但是,如果您完全这样做,那您就错了。
有问题的两个字节数组是 { 0x00, 0x80 } 和 { 0x00, 0x81 }。它的第一个字节将被解码为 U+0000,第二个字节是字符的 UTF-8 编码的 start,但它是不完整的 - 所以解码器使用 ?
。所以两个字符串都是 "[=13=]?"
.
如果要将BigDecimal
转换为字符串,只需调用toString()
。如果要将任意二进制数据表示为字符串,请使用base64或hex,或一些类似的编码方案designed将任意二进制数据表示为字符串. UTF-8 旨在将任意 text 数据表示为二进制数据。
在玩 Avro 的过程中,我发现了以下内容:
new String(new BigDecimal("1.28").unscaledValue().toByteArray(), Charset.forName("UTF-8"))
.equals(
new String(new BigDecimal("1.29").unscaledValue().toByteArray(), Charset.forName("UTF-8")))
-> true !!!!!!!!
DatatypeConverter.printBase64Binary(new BigDecimal("1.28").unscaledValue().toByteArray())
.equals(
DatatypeConverter.printBase64Binary(new BigDecimal("1.29").unscaledValue().toByteArray()))
-> false (as expected)
但是
new String(new BigDecimal("1.26").unscaledValue().toByteArray(), Charset.forName("UTF-8"))
.equals(
new String(new BigDecimal("1.27").unscaledValue().toByteArray(), Charset.forName("UTF-8")))
-> false (as expected)
谁能给我解释一下这是怎么回事?似乎 1.27 是截止点。 理想情况下,我需要
new String(new BigDecimal("1.28").unscaledValue().toByteArray(), Charset.forName("UTF-8"))
适用于每个 BigDecimal 值。
Can someone explain to me what is going on?
是的,您在滥用数据。 BigDecimal.toByteArray()
的结果 不是 字符串的 UTF-8 编码表示形式,因此您不应尝试以这种方式将其转换为字符串。
一些 不同的字节数组可能 "decoded" 通过 UTF-8 到字符串一样,如果它们基本上是无效的。如果您查看 new BigDecimal("1.28").unscaledValue().toByteArray()
的结果以及 1.29 的结果,您会发现它们无效,因此都解码为包含“?”的字符串。但是,如果您完全这样做,那您就错了。
有问题的两个字节数组是 { 0x00, 0x80 } 和 { 0x00, 0x81 }。它的第一个字节将被解码为 U+0000,第二个字节是字符的 UTF-8 编码的 start,但它是不完整的 - 所以解码器使用 ?
。所以两个字符串都是 "[=13=]?"
.
如果要将BigDecimal
转换为字符串,只需调用toString()
。如果要将任意二进制数据表示为字符串,请使用base64或hex,或一些类似的编码方案designed将任意二进制数据表示为字符串. UTF-8 旨在将任意 text 数据表示为二进制数据。