不要使用PeekChar()判断EOF

  • 在做后台jce 数据mock fiddler插件时,开发提了一个需求: 接口协议支持新旧版本

  • 分析:
    1)新协议一般只在旧协议上增加了一些optional 字段
    2)需要key -value 都展现出来

  • 思路: jcestruct.readFrom ->jceinputstream.Read() ->skipToTag 中在BinaryReader.readbyte()时判断是否流尾

  • 错误方案:
    public bool skipToTag(int tag)
    {
    if (br.PeekChar() == -1) return false;
    ……

  • 在非流结尾处就会报错:
    输出字符缓冲区太小,无法包含解码后的字符,编码“Unicode (UTF-8)”的操作回退“System.Text.DecoderReplacementFallback”。
    参数名: chars

有两个点要解决:1、UTF-8编码的问题;2、PeekChar的工作详细细节。这里暂时没空去细究 为啥出错,先解决问题吧

*正确方案:
(br.basestream.Position >= br.basestream.Length)

不要使用PeekChar()判断EOF