2

所以,我使用ReadFilefromkernel32来读取文件。SetFilePointer这是我在和的帮助下读取文件的代码ReadFile

public long ReadFileMe(IntPtr filehandle, int startpos, int length, byte[] outdata)
{
    IntPtr filea = IntPtr.Zero;
    long ntruelen = GetFileSize(filehandle, filea);
    int nRequestStart;
    uint nRequestLen;
    uint nApproxLength;
    int a = 0;
    if (ntruelen <= -1)
    {
        return -1;
    }
    else if (ntruelen == 0)
    {
        return -2;
    }

    if (startpos > ntruelen)
    {
        return -3;
    }
    else if (length <= 0)
    {
        return -5;
    }
    else if (length > ntruelen)
    {
        return -6;
    }
    else
    {
        nRequestStart = startpos;
        nRequestLen = (uint)length;

        outdata = new byte[nRequestLen - 1];

        SetFilePointer(filehandle, (nRequestStart - 1), ref a, 0);
        ReadFile(filehandle, outdata, nRequestLen, out nApproxLength, IntPtr.Zero);
        return nApproxLength; //just for telling how many bytes are read in this function
    }
}

当我使用这个函数时,它可以工作(用于另一个目的),所以这个代码已经过测试并且可以工作。

但主要问题是,我现在需要将outdata函数放入字节的参数转换为string.

我尝试使用Encoding.Unicode等(所有UTF),但它不起作用。

4

3 回答 3

1

嗯... Encoding.Name_of_encoding.GetString 必须工作...尝试这样的事情:

var convertedBuffer = Encoding.Convert(
             Encoding.GetEncoding( /*name of encoding*/),Encoding.UTF8, outdata);
var str = Encoding.UTF8.GetString(convertedBuffer);

更新:那这个呢?

using (var streamReader = new StreamReader(@"C:\test.txt", true))
        {
            var currentEncoding = streamReader.CurrentEncoding.EncodingName;
            Console.WriteLine(currentEncoding);
        }
于 2012-12-26T07:32:22.170 回答
1

尝试使用Encoding.GetString (Byte[], Int32, Int32)方法。byte这会将指定byte数组中的 s 序列解码为 a string

于 2012-12-26T07:30:55.217 回答
0

您可能需要在参数上添加 out 参数outdata使用 ref 和 out 传递数组

public long ReadFileMe(IntPtr filehandle, int startpos, int length, out byte[] outdata)
于 2012-12-26T09:51:24.773 回答