2017-10-17 71 views
0

我试图找出一些东西,而阅读二进制文件。从二进制文件获取值类型c#

在我的文件上,在开始处有一个长类型值('8'),然后根据文件,下一个值将是一个字母(例如'E')或另一个长字符'5')。 我的问题是:我怎样才能知道我正在读取的文件中有什么样的数据值?

我的代码如下所示:

 FileStream streamR = new FileStream(archivo, FileMode.Open, FileAccess.Read); 
     BinaryReader reader = new BinaryReader(streamR); 

     Boolean checkNext = false; 
     Boolean bandHeadr = false; 
     Boolean bandRank = false; 
     long archivoPos; 

     while (reader.BaseStream.Position != reader.BaseStream.Length) 
     { 
      if (bandHeadr == false) 
      { 
       // HERE IT READS THE FIRST VALUE, ALWAYS A LONG TYPE VALUE 
       long header = reader.ReadInt64(); 
       data.Add(header); 
       bandCabecera = true; 
      } 

      if (checkNext == false) 
      { 
       try 
       { 
        // HERE I'M TRYING TO CHECK THE NEXT VALUE, BUT RETURNS AN ASCII CODE IF IT IS A LETTER 
        int ix = reader.PeekChar(); 
       } 
       catch 
       { 
        // THIS WILL IF THE NEXT VALUE IS ANOTHER LONG 
        if (bandRank == false) 
        { 
         try 
         { 
          long rang = reader.ReadInt64(); 
          rangO = rang; 
          button9.Enabled = false; 
         } 
         catch 
         { 
          // EMPTY CATCH 
         } 
         bandRank = true; 
        } 
       } 
       checkNext = true; 
      } 
     } 

我使用PeekChar不移动到文件的下一个位置的缘故。

+0

如果你知道它将是一个数字或字母,那么你可以尝试'TryParse',如果它成功那么你将它保存为一个数字,如果它失败,然后将其保存为'char'。 –

+0

如果您可以使用C#7,那么您可以尝试使用模式的'Switch'语句。 [MSDN](https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/) –

+0

另外,请记住,没有文字,但编码文本。当你得到文本字节时,你还必须得到他们编写的编码。而且,没有一个多字节整数表示,而是两个:小端和大端。所有这些都必须以文件格式传达。 –

回答

2

我怎样才能知道我在我的文件上读取什么样的数据值?

你不行。不是从字节本身(而不是文件的扩展等)。字节只是字节。他们代表什么取决于谁写的文件。尝试查看它是否有意义,例如它是否必须是'A'或int - 如果它不是'A' - 它是一个int。但它也可能是第一个一个int的字节恰好与'A'的ASCII(?)值相同。)

+1

Spot on。也许值得一提的是,二进制文件通常通过定义格式来给读者一个提示 – Gus

+0

来解决缺乏清晰度的问题。然后最好的方法是尝试将第二个值作为'char'读取?因为我这样做了,它仍然读取它不管。 – CodeXtack

+0

@CodeXtack对不起。我不明白你的评论,所以我不能回答。但无论如何,请参阅Gus的评论 - 重点在于正确的方法是让文件的创建者将这些信息传达给您。这可以做到,例如,某个字节是一个标志,表示它后面的字节是char还是long。 – ispiro