编解码是否一一映射? - 创意小软件开发要塞- JavaEye技术网站
        ByteArrayOutputStream baos=new ByteArrayOutputStream();
        DataOutputStream dos=new DataOutputStream(baos);
        dos.writeByte(2);
        dos.writeByte(3);
        dos.writeByte(0x83);
        
        String data=baos.toString();
        byte[] buf=baos.toByteArray();

        ByteArrayInputStream bais1=new ByteArrayInputStream(data.getBytes());
        DataInputStream dis1=new DataInputStream(bais1);
        System.out.println(dis1.readByte());
        System.out.println(dis1.readByte());
        System.out.println(dis1.readUnsignedByte());
        System.out.println("------------------------------------");
        ByteArrayInputStream bais2=new ByteArrayInputStream(buf);
        DataInputStream dis2=new DataInputStream(bais2);
        System.out.println(dis2.readByte());
        System.out.println(dis2.readByte());
        System.out.println(dis2.readUnsignedByte());

?

打印结果:
2
3
239
------------------------------------
2
3
131


问 题:

为什么这2个打印结果不一样呢?

?

回 答:

这个原因应该是某些码值在某些字符集下编解码过程非一一映射导致

某些默认系统编码比如GBK,在decoding时,即 baos.toString(),会出现malformed-input和unmappable-character sequences被系统默认串替代的情况;在encoding时,即data.getBytes(),也会出现在默认字符集中无法被编码的串,这时候结 果是未定的。

验证一下,替换 dos.writeByte(0x83) => dos.writeByte(0x7f) 结果则是一样的 都是127

由此可见。

?

{zx1}评论

  • 谢谢你的回复,在你启发下我去debug了下程序,的确只有在read()方法的时候当 ...
    -- by

  • 回楼下huayurei:??? 原来的认识是有问题的, 看BufferedRead ...
    -- by

  • wentao365 写道 return obj; 是不是写错了?这里retur ...
    -- by

  • 这个解释是有可能会引起异常,偏偏我怎么设置都不产生异常,搞了我半天都没明白这个ma ...
    -- by

  • return obj; 是不是写错了?
    -- by
郑重声明:资讯 【编解码是否一一映射? - 创意小软件开发要塞- JavaEye技术网站】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——