C# 将文件的一部分作为文本读取,另一部分作为二进制读取

C# 将文件的一部分作为文本读取,另一部分作为二进制读取,c#,C#,我有一个这样做的文件 10 NDI 27 2477 6358 4197-67 0 VVFAˆÿÿÿÿÿ 最后一列是二进制的。 我必须阅读这个文件,问题是我不能将它作为文本阅读,因为在某些行中,最后一列有一个新行字符,因此我不会阅读整行。 然后我应该将其作为二进制文件读取,但是如何检索第一列和第三列呢? 我尝试通过以下方式读取字节: byte[] lines1 = System.IO.File.ReadAllBytes("D:\\dynamic\\ap1_dynamic\\AP_1.txt");

我有一个这样做的文件

10 NDI 27 2477 6358 4197-67 0 VVFAˆÿÿÿÿÿ

最后一列是二进制的。 我必须阅读这个文件,问题是我不能将它作为文本阅读,因为在某些行中,最后一列有一个新行字符,因此我不会阅读整行。 然后我应该将其作为二进制文件读取,但是如何检索第一列和第三列呢? 我尝试通过以下方式读取字节:

byte[] lines1 = System.IO.File.ReadAllBytes("D:\\dynamic\\ap1_dynamic\\AP_1.txt");
然后用

 for (i = 0; i < lines1.Length; i++) {
       Convert.ToString(lines1[i],2);
 }
但它会将所有内容都读取为0和1。。我想把前8列读成文本,而最后一列读成二进制


我使用的是Visual Studio 2013,C.

以二进制形式读取文件是正确的,因为您可以将部分二进制数据转换为文本。在此上下文中,二进制表示字节

将字节转换为二进制不是您想要做的事情。在这个上下文中,二进制表示base2中的文本表示,但您不需要数据的文本表示

如果行的长度固定,则可以执行以下操作来读取值:

int lineLen = 70; // correct this with the actual length
int firstPos = 0;
int firstLen = 3; // correct with actual length
int thirdPos = 15; // correct with actual position
int thirdLen = 3; // correct with actual length
int lastPos = 60; // correct with actual position
int lastLen = 10; // correct with actual length

int lines = lines.length / lineLength;
for (int i = 0; i < lines; i++) {
  int first = Int32.Parse(Encoding.UTF8.GetString(i * lineLen + firstPos, firstLen).Trim());
  int third = Int32.Parse(Encoding.UTF8.GetString(i * lineLen + thirdPos, thirdLen).Trim());
  byte[] last = new byte[lastLen];
  Array.Copy(lines1, i * lineLen + lastPos, last, 0, lastLen);
  // do something with the data in first, third and last
}

如果二进制数据包含换行符怎么办?您的文件可以包含多行这样的数据吗?这只有在文本看起来是固定长度的情况下才实用。是吗?是的。二进制数据肯定包含换行符,因为它会转到新行。二进制数据的大小是否在文本部分编码?或者你怎么知道何时到达二进制数据的末尾?是的,谢谢,这可能会帮助我!但是线条的长度并不总是一样的,我的意思是结构是这样的,但首先我也可以有一个像11560这样的数字,因此每次长度都会改变。@ayasha:那么你就有问题了。。。根据你所说的,没有确定的方法来确定每一行从哪里开始。如果二进制数据碰巧包含一些看起来像行首的内容,那么您将很难编写代码来确定这些内容。从理论上讲,二进制数据可能包含看起来像完整的另一行的内容,因此无法判断它是实际行还是二进制数据的一部分。您只需要一些更多的信息,可以用来确定每条线的长度。