Delphi转换自c#

时间:2015-09-12 10:49:20

标签: c# delphi

我真的需要你的帮助将这个c#代码移植到Delphi one:

public unsafe byte[] Encode(byte[] inputPcmSamples, int sampleLength, out int encodedLength)
        {
            if (disposed)
                throw new ObjectDisposedException("OpusEncoder");

            int frames = FrameCount(inputPcmSamples);
            IntPtr encodedPtr;
            byte[] encoded =new byte [MaxDataBytes];
            int length = 0;
           /* How this can be ported to delphi */
            fixed (byte* benc = encoded)
            {
                encodedPtr = new IntPtr((void*)benc);
                length = API.opus_encode(_encoder, inputPcmSamples, frames, encodedPtr, sampleLength);
            }
            encodedLength = length;
            if (length < 0)
                throw new Exception("Encoding failed - " + ((Errors)length).ToString());

            return encoded;
        }

我正在寻找的主要代码部分是:

fixed (byte* benc = encoded)
                {
                    encodedPtr = new IntPtr((void*)benc);
                    /* API.opus_encode = is declared in an other Class */ 
                    length = API.opus_encode(_encoder, inputPcmSamples, frames, encodedPtr, sampleLength);
                }
非常感谢

1 个答案:

答案 0 :(得分:0)

您似乎想知道如何处理C#中的fixed块。

byte[] encoded =new byte [MaxDataBytes];
....
fixed (byte* benc = encoded)
{
    encodedPtr = new IntPtr((void*)benc);
    length = API.opus_encode(_encoder, inputPcmSamples, frames, encodedPtr, sampleLength);
}

fixed的这种用法是固定托管数组以获取要传递给非托管代码的指针。

在Delphi中,我们只需要一个字节数组和一个指向该数组的指针。这看起来像这样:

var
  encoded: TBytes;
....
SetLength(encoded, MaxDataBytes);
....
length := opus_encode(..., Pointer(encoded), ...);

或者也许:

length := opus_encode(..., PByte(encoded), ...);

或者也许:

length := opus_encode(..., @encoded[0], ...);

取决于您如何声明导入的函数opus_encode和您的偏好。

如果MaxDataBytes的值足够小,缓冲区可以在堆栈上存在,并且MaxDataBytes在编译时已知,那么可以使用固定长度的数组。