使用未知的dll从文件中读取字节数组

时间:2012-10-12 00:21:09

标签: c# bytearray

这是我在writing a byte array from as string using an unknown dll

之后的下一个问题

所以我设法写了字节数组,现在我想用同样的dll读回来。

我尝试了以下内容:

int BufSize = 60000000;  // Size of file I/O buffers.
int BufSizeM1M = BufSize - 1000000; // The max amount of data read in at any one time.
using (WinFileIO WFIO = new WinFileIO())
{
    WFIO.OpenForReading(path);
    WFIO.ReadBlocks(BufSizeM1M);
    WFIO.Close();
    WFIO.Dispose();
}

这是WinFileIO.ReadBlocks函数:

public int ReadBlocks(int BytesToRead)
        {
            // This function reads a total of BytesToRead at a time.  There is a limit of 2gb per call.
            int BytesReadInBlock = 0, BytesRead = 0, BlockByteSize;
            byte* pBuf = (byte*)pBuffer;
            // Do until there are no more bytes to read or the buffer is full.
            do
            {
                BlockByteSize = Math.Min(BlockSize, BytesToRead - BytesRead);
                if (!ReadFile(pHandle, pBuf, BlockByteSize, &BytesReadInBlock, 0))
                {
                    Win32Exception WE = new Win32Exception();
                    ApplicationException AE = new ApplicationException("WinFileIO:ReadBytes - Error occurred reading a file. - "
                        + WE.Message);
                    throw AE;
                }
                if (BytesReadInBlock == 0)
                    break;
                BytesRead += BytesReadInBlock;
                pBuf += BytesReadInBlock;
            } while (BytesRead < BytesToRead);
            return BytesRead;
        }

我的问题是,如何使用该函数读取实际文件?

1 个答案:

答案 0 :(得分:0)

要尝试以稍高的抽象级别回答您的问题,如果您正在使用“未知”的.NET程序集,您可以尝试的一件事是反编译程序集并计算出源代码中发生的事情

反编译比听起来容易。只需使用免费工具ILSpy打开程序集(DLL)即可。然后,您可以查看您尝试在C#(甚至CIL)中使用的方法的来源。

查看源代码将让您了解.NET基类库的哪些部分正在使用,并查阅相关文档,或者在此处发布有关您不理解的源代码的其他问题。

如果没有这个来源,我们所能做的就是猜测未知程序集支持的可能的API和工作流程。

尽管我的建议如上,但这是我的猜测:

  • 看起来你试图从文件中读取BufSizeM1M字节而不检查它是否包含那么多数据。

以下是对您的代码的一些其他评论:

  • 您正在调用WFIO.Dispose();,但WFIO是在using语句中创建的,因此该行是不必要的(但这不会是错误)。
  • 当您同时处理对象时,WFIO.Close()是多余的是可能的(也是可取的)。

修改

所以看起来WinFileIO.ReadBlocks使用Win32 ReadFile函数将BytesToRead字节读入pBuffer指向的缓冲区。我想你需要在WinFileIO上找到另一种方法,让你可以访问缓冲区。诀窍是看看哪些其他方法对pBuffer做了些什么。例如,可能有一个方法将其转换为byte[]并将其返回给您,这可能看起来像这样:

public byte[] GetBuffer()
{
    byte[] bytes=new byte[length];
    for(int i=0; i<length; i++)
    {
        bytes[i]=Marshal.ReadByte(pBuffer,i);
    }
    return bytes;
}