StreamReader和EBCDIC的奇怪行为:为什么?

拉丹

背景:我必须编写一个应用程序,该应用程序使用一个设计不良的EBCDIC文件,其中包含使用ASCII行终止符的二进制数据,并且有时二进制数据碰巧包含ASCII CRLF,这会导致行错误地分割。我需要采用这种旧文件格式,并在每条记录的末尾删除CRLF。

似乎使用StreamReaderwithIBM037编码会导致该ReadLine()方法只读取\r到行尾,而不是\r\n我期望的那样,因此,我从ReadLineLF(0A以ASCII开头开头的每个字符串(在第一个字符串之后)都会返回

重现此问题的示例程序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

class Program
{
  static void Main(string[] args)
  {
    //generate example EBCDIC data
    List<byte> bytes = new List<byte>();
    Encoding EBCDIC = Encoding.GetEncoding("IBM037");
    bytes.AddRange(Encoding.Convert(Encoding.ASCII, EBCDIC, Encoding.ASCII.GetBytes("Some nice ascii text")));
    bytes.AddRange(new byte[] { (byte)'\r', (byte)'\n' });
    bytes.AddRange(Encoding.Convert(Encoding.ASCII, EBCDIC, Encoding.ASCII.GetBytes("Some more nice ascii text")));

    //read it using StreamReader
    using(MemoryStream ms = new MemoryStream(bytes.ToArray()))
    using (StreamReader reader = new StreamReader(ms, EBCDIC))
    {
      string line = string.Empty;
      while ((line = reader.ReadLine()) != null)
      {
        EBCDIC.GetBytes(line).ToList().ForEach(c => Console.Write(c));
        Console.WriteLine();
      }
    }
    Console.ReadLine();
  }
}

输出应如下所示:

226150148133641491371311336412916213113713764163133167163
1022615014813364148150153133641491371311336412916213113713764163133167163

第二行开头的10应该不存在,因为那是CRLF序列中的LF。

我对ReadLine方法的理解是:

一行定义为一系列字符,后跟换行符(“ \ n”),回车符(“ \ r”)或回车符后紧跟换行符(“ \ r \ n”)。返回的字符串不包含终止回车符或换行符。来源

它没有说改变编码的任何内容,因此据此它应该读取我数据中的完整CRLF,而不仅仅是CR。

更新:我已经解决了这个问题,并实现了自己的读取数据的方法,但是我的问题仍然如下:为什么ReadLine不听锡说什么?

迈克尔·伯尔

您将(byte)'\r'填充(byte)'\n'到一个流中,告诉该流StreamReader已用EBCDIC编码。

的值为(byte) '\r'0x0d,碰巧是ASCII和EBCDIC中的回车符。

的值为(byte) '\n'0x0a,它是ASCII中的换行符,但不是EBCDIC中的换行符。

如果您查看EBCDIC Encoder类如何将值0x0a解码为.NET Unicodechar类型,则会发现Unicode的数字值为char142(或0x8e)。而且该字符不是换行符。(我不知道为什么将其解码为142)。

您会在第二行的开头看到输出“ 10”的原因,不是因为那里有换行,而是因为值142的char被重新编码回值为10的EBCDIC字节(在子表达式中EBCDIC.GetBytes(line)) 。

因此,很简单地回答您的问题,ReadLine()只会看到回车,而不是回车后跟换行符。

while循环更改为如下所示:

while ((line = reader.ReadLine()) != null)
{
    line.ToList().ForEach(c => { Console.Write(c); Console.Write(" "); });
    Console.WriteLine();
    line.ToList().ForEach(c => { Console.Write(Convert.ToInt32(c)); Console.Write(" "); });
    Console.WriteLine();
    EBCDIC.GetBytes(line).ToList().ForEach(c => { Console.Write(c); Console.Write(" "); });
    Console.WriteLine();
    Console.WriteLine();
    Console.WriteLine();
}

您将在第二行中获得以下输出,该行显示(从EBCDIC转换为)字符的行,这些字符的Unicode值,最后将这些字符的值转换回EBCDIC:

? S o m e   m o r e   n i c e   a s c i i   t e x t
142 83 111 109 101 32 109 111 114 101 32 110 105 99 101 32 97 115 99 105 105 32 116 101 120 116
10 226 150 148 133 64 148 150 153 133 64 149 137 131 133 64 129 162 131 137 137 64 163 133 167 163

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么添加和分配(+ =)与numpy.ndarrays行为奇怪?

来自分类Dev

奇怪的异常行为...为什么?

来自分类Dev

奇怪的异常行为...为什么?

来自分类Dev

为什么Numpy Diag函数的行为很奇怪?

来自分类Dev

`locate`通配符奇怪的行为-为什么?

来自分类Dev

为什么Numpy Diag函数的行为很奇怪?

来自分类Dev

为什么operator()具有奇怪的行为?

来自分类Dev

为什么子进程行为如此奇怪?

来自分类Dev

奇怪的维度行为:需要维度 2 和维度 3 不确定为什么

来自分类Dev

为什么此JavaScript函数的行为如此奇怪?

来自分类Dev

为什么会有这种奇怪的行为?

来自分类Dev

为什么调用错误的方法:奇怪的继承行为

来自分类Dev

使用eval()的奇怪的关闭行为-为什么呢?

来自分类Dev

有角度的。为什么复选框的行为很奇怪?

来自分类Dev

Python的奇怪行为(IndentationError:意外缩进)-为什么?

来自分类Dev

为什么node.js的异步行为很奇怪?

来自分类Dev

审查后应用程序行为奇怪是为什么?

来自分类Dev

为什么会有这种奇怪的行为?

来自分类Dev

jQuery.text()显示出奇怪的行为,为什么?

来自分类Dev

AngularJS:为什么ng-controller的ng-show和ng-click以及<p>标签的行为奇怪?

来自分类Dev

为什么在删除和创建数据库时rake数据库任务的行为会很奇怪?

来自分类Dev

FALSE和TRUE的奇怪定义,为什么?

来自分类Dev

||奇怪的Ruby行为 和 &&

来自分类Dev

加入和的奇怪行为

来自分类Dev

OpenXml 和奇怪的行为

来自分类Dev

在同一Stream上创建多个StreamReader的奇怪行为

来自分类Dev

Outlook中的蓝线是什么?为什么它的行为如此奇怪?

来自分类Dev

DateTime和DateTimeZone的奇怪行为

来自分类Dev

Camera和SurfaceView的奇怪行为

Related 相关文章

  1. 1

    为什么添加和分配(+ =)与numpy.ndarrays行为奇怪?

  2. 2

    奇怪的异常行为...为什么?

  3. 3

    奇怪的异常行为...为什么?

  4. 4

    为什么Numpy Diag函数的行为很奇怪?

  5. 5

    `locate`通配符奇怪的行为-为什么?

  6. 6

    为什么Numpy Diag函数的行为很奇怪?

  7. 7

    为什么operator()具有奇怪的行为?

  8. 8

    为什么子进程行为如此奇怪?

  9. 9

    奇怪的维度行为:需要维度 2 和维度 3 不确定为什么

  10. 10

    为什么此JavaScript函数的行为如此奇怪?

  11. 11

    为什么会有这种奇怪的行为?

  12. 12

    为什么调用错误的方法:奇怪的继承行为

  13. 13

    使用eval()的奇怪的关闭行为-为什么呢?

  14. 14

    有角度的。为什么复选框的行为很奇怪?

  15. 15

    Python的奇怪行为(IndentationError:意外缩进)-为什么?

  16. 16

    为什么node.js的异步行为很奇怪?

  17. 17

    审查后应用程序行为奇怪是为什么?

  18. 18

    为什么会有这种奇怪的行为?

  19. 19

    jQuery.text()显示出奇怪的行为,为什么?

  20. 20

    AngularJS:为什么ng-controller的ng-show和ng-click以及<p>标签的行为奇怪?

  21. 21

    为什么在删除和创建数据库时rake数据库任务的行为会很奇怪?

  22. 22

    FALSE和TRUE的奇怪定义,为什么?

  23. 23

    ||奇怪的Ruby行为 和 &&

  24. 24

    加入和的奇怪行为

  25. 25

    OpenXml 和奇怪的行为

  26. 26

    在同一Stream上创建多个StreamReader的奇怪行为

  27. 27

    Outlook中的蓝线是什么?为什么它的行为如此奇怪?

  28. 28

    DateTime和DateTimeZone的奇怪行为

  29. 29

    Camera和SurfaceView的奇怪行为

热门标签

归档