Wrapper的parseXXX()用于签名二进制误解

时间:2013-02-18 13:53:19

标签: java parsing binary api-design

我们以Byte.parseByte()为例,作为其中一个包装“parseXXX()

来自parseByte(String s, int radix)'s JavaDoc

  

将字符串参数解析为指定的基数中的带符号字节   第二个论点。

但如果radix = 2那就不太正确了。换句话说,-127的二进制文字是10000000

byte b = (byte) 0b10000000;

所以以下情况应该是真的:

byte b = Byte.parseByte("10000000", 2);

但不幸的是,它会抛出NumberFormatException,而我必须按照以下方式执行:

byte b = Byte.parseByte("-111111", 2);

其中parseByte()将二进制字符串解析为符号幅度(符号和幅度),它应该解析为带符号的二进制(2的补码,即MSB是符号位)。

我错了吗?

2 个答案:

答案 0 :(得分:4)

  

我错了吗?

是。 Javadoc对2的补码一无所知。实际上,它明确说明了它如何识别负值(即-前缀,因此实际上是“人类可读的”符号量级。)

以另一种方式思考。如果parseByte将radix-2解释为2的补码,那么你希望它对radix-10(或者其他任何基数)做什么?为了保持一致性,它必须是10的补码,这是不方便的,我可以向你保证!

答案 1 :(得分:1)

这是因为parseByte“10000000”是一个正值(128),它不适合字节值-128到128.但是我们可以用BigInteger解析两个二进制字符串表示法:

byte b = new BigInteger("10000000", 2).byteValue()

这给出了预期的-128结果