0

这是我使用未知 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;
        }

我的问题是,如何使用该功能来读取实际文件?

4

1 回答 1

0

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

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

查看源代码可以让您了解正在使用 .NET 基类库的哪些部分,并为此查阅文档,或者甚至在此处发布另一个关于您不理解的源代码的问题。

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

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

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

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

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

编辑:

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

public byte[] GetBuffer()
{
    byte[] bytes=new byte[length];
    for(int i=0; i<length; i++)
    {
        bytes[i]=Marshal.ReadByte(pBuffer,i);
    }
    return bytes;
}
于 2012-10-12T01:03:56.590 回答