2

そのため、ファイルの読み取りにReadFilefromを使用しています。とkernel32を使用してファイルを読み取るコードを次に示します。SetFilePointerReadFile

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です。

など(全てUTF)を使ってみEncoding.Unicodeたのですが、うまくいきません。

4

3 に答える 3

1

Encoding.GetString (Byte[], Int32, Int32)メソッドを使用してみてください。byteこれにより、 sのシーケンスが指定されbyteた配列からにデコードされますstring

于 2012-12-26T07:30:55.217 に答える
1

うーん...Encoding.Name_of_encoding.GetStringは機能する必要があります...次のようにsmthを試してください:

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 に答える
0

パラメータにoutパラメータを追加する必要がある場合がありoutdataます: refおよびoutを使用した配列の受け渡し

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