2

私はF#を学ぼうとしていますが、現時点では、単純なC#関数をいくつかの点でF#に変換しようとしていvar compressedData = new byte[memoryStream.Length];ます。

public static string CompressString(string text)
{
    byte[] buffer = Encoding.UTF8.GetBytes(text);
    var memoryStream = new MemoryStream();
    using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress, true))
    {
        gZipStream.Write(buffer, 0, buffer.Length);
    }

    memoryStream.Position = 0;

    var compressedData = new byte[memoryStream.Length];
    memoryStream.Read(compressedData, 0, compressedData.Length);

    var gZipBuffer = new byte[compressedData.Length + 4];
    Buffer.BlockCopy(compressedData, 0, gZipBuffer, 4, compressedData.Length);
    Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gZipBuffer, 0, 4);
    return Convert.ToBase64String(gZipBuffer);
}

そしてここで私の半分の翻訳版

let compress(text:string)=
    let buffer = Encoding.UTF8.GetBytes(text)
    use memoryStream = new MemoryStream()
    let gZipStream = new GZipStream(memoryStream, CompressionMode.Compress, true)
    gZipStream.Write(buffer, 0, buffer.Length)
    memoryStream.Position <- Convert.ToInt64(0)
    let compressedData = Array.init memoryStream.Length(fun i -> byte) //< Here i stuck
    memoryStream.Read(compressedData, 0, compressedData.Length)
    use gZipBuffer = (compressedData.Length + 4)

過去3日間、問題を解決するためにgoogleで検索しましたが、解決策が見つかりませんでした。ここの誰かが私を助けてくれることを願っています:)よろしくお願いします

4

2 に答える 2

3

編集:コンパイルされるように翻訳を修正しました(そして今は動作するはずです)。

open System
open System.IO
open System.IO.Compression
open System.Text

let compressString (text : string) =
    let buffer = Encoding.UTF8.GetBytes text
    using (new MemoryStream ()) <| fun memoryStream ->
        using (new GZipStream(memoryStream, CompressionMode.Compress, true)) <| fun gzipStream ->
            gzipStream.Write (buffer, 0, Array.length buffer)

        memoryStream.Position <- 0L

        let compressedData = Array.zeroCreate (int memoryStream.Length)

        let numBytesRead = memoryStream.Read (compressedData, 0, compressedData.Length)
        if numBytesRead = compressedData.Length then
            let gzipBuffer = Array.zeroCreate (compressedData.Length + 4)
            Buffer.BlockCopy (compressedData, 0, gzipBuffer, 4, compressedData.Length)
            Buffer.BlockCopy (BitConverter.GetBytes buffer.Length, 0, gzipBuffer, 0, 4)
            Convert.ToBase64String gzipBuffer
        else
            failwithf "Tried to read %i bytes but was only able to read %i."
                compressedData.Length numBytesRead
于 2012-09-21T17:54:40.817 に答える
1

を探していArray.zeroCreateます。

let compressedData = Array.zeroCreate (int memoryStream.Length)
于 2012-09-21T17:44:13.517 に答える