Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用c#读取二进制文件?_C#_Binary Data - Fatal编程技术网

如何使用c#读取二进制文件?

如何使用c#读取二进制文件?,c#,binary-data,C#,Binary Data,我有一个二进制文件。我不知道如何使用C#读取这个二进制文件 < C++中描述的二进制文件中的记录定义为: #define SIZEOF_FILE(10*1024) //Size of 1234.dat file is: 10480 + 32 byte (32 = size of file header) typedef struct FileRecord { WCHAR ID[56]; WCHAR Name[56]; int Gender; float Height; WCHAR T

我有一个二进制文件。我不知道如何使用C#读取这个二进制文件

< C++中描述的二进制文件中的记录定义为:

#define SIZEOF_FILE(10*1024)
//Size of 1234.dat file is: 10480 + 32 byte (32 = size of file header)
typedef struct FileRecord
{
 WCHAR ID[56]; 
 WCHAR Name[56];
 int Gender;
 float Height;
 WCHAR Telephne[56];
 and........
}
如何读取包含C#中记录的二进制文件,并在编辑后将其写回?

您可以使用读取文件-使用
文件。Open
方法打开文件并获取
文件流
-查看此处了解更多信息请参阅下面的示例

 public byte[] ReadByteArrayFromFile(string fileName)
{
  byte[] buff = null;
  FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
  BinaryReader br = new BinaryReader(fs);
  long numBytes = new FileInfo(fileName).Length;
  buff = br.ReadBytes((int)numBytes);
  return buff;
}

希望这有助于

使用
struct
类型和
StructLayout
直接映射到二进制文件中的数据结构,实际上有一种更好的方法来实现这一点(我还没有测试实际的映射,但只需查找并检查从读取文件中得到的信息):

[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Unicode,Pack=1)]
公共结构文件记录
{
[Marshallas(UnmanagedType.ByValArray,SizeConst=56)]
公共字符[]ID;
[Marshallas(UnmanagedType.ByValArray,SizeConst=56)]
公共字符[]名称;
公共性别;
公众浮标高度;
//...
}
班级计划
{
受保护的静态T ReadStruct(流)
{
byte[]buffer=新字节[Marshal.SizeOf(typeof(T))];
stream.Read(buffer,0,Marshal.SizeOf(typeof(T));
GCHandle=GCHandle.Alloc(缓冲区,GCHandleType.pinted);
T typedStruct=(T)Marshal.PtrToStructure(handle.addrofpindedObject(),typeof(T));
handle.Free();
返回类型结构;
}
静态void Main(字符串[]参数)
{
使用(Stream-Stream=newfilestream(@“test.bin”、FileMode.Open、FileAccess.Read))
{
FileRecord FileRecord=ReadStruct(流);
}
}

<代码> >你已经发布的代码看起来像C或C++。C中没有“代码”TyPufF。@约翰:我认为OP是用他所知道的语言描述文件,这样我们就可以帮助他打开C文件中的文件。我想你知道文件的结构了吗?否则,你将难以解释内容:+)1。“…检查您从读取文件中得到的信息”您将如何做到这一点,即您在寻找什么?我是处理二进制数据的完全新手。您必须了解文件中二进制数据的布局,即记录大小、每个记录中的字段以及它们的大小。
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 1)]
public struct FileRecord
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 56)]
    public char[] ID;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 56)]
    public char[] Name;
    public int Gender;
    public float height;
    //...
}

class Program
{
    protected static T ReadStruct<T>(Stream stream)
    {
        byte[] buffer = new byte[Marshal.SizeOf(typeof(T))];
        stream.Read(buffer, 0, Marshal.SizeOf(typeof(T)));
        GCHandle handle = GCHandle.Alloc(buffer, GCHandleType.Pinned);
        T typedStruct = (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T));
        handle.Free();
        return typedStruct;
    }

    static void Main(string[] args)
    {
        using (Stream stream = new FileStream(@"test.bin", FileMode.Open, FileAccess.Read))
        {
            FileRecord fileRecord = ReadStruct<FileRecord>(stream);
        }
    }