将C#字节数组传递给C char *字段

时间:2015-02-17 23:02:00

标签: c# arrays marshalling

我需要将字节数组从C#应用程序传递给C DLL。

这是C结构:

typedef struct FOO_BAR
{
    uint32_t timestamp;
    char *payload;
    uint32_t payloadSize;
} FOO_BAR;

更新值的C#方法:

public void Update(uint newTimestamp, byte[] payload)
{
    var foobar = (FooBar) Marshal.PtrToStructure(_foobarHandle, typeof (FooBar));

    foobar.timestamp = newTimestamp;
    foobar.payloadSize = (uint) payload.Length;
    foobar.payload = Marshal.AllocHGlobal((int) foobar.payloadSize);
    Marshal.Copy(payload, 0, foobar.payload, (int) foobar.payloadSize);

    Marshal.StructureToPtr(foobar, _foobarHandle, false);
}

C#结构:

[StructLayout(LayoutKind.Sequential)]
public struct FooBar
{        
    public uint timestamp;       
    public IntPtr payload;
    public uint payloadSize;
}

问题出在FOO_BAR.payload上。 Marshaling运行良好,但变量包含有符号字节而不是字节。

由于我无法修改C程序,如何从bytes数组中获取正确的char值?

DLL端的值如下:

            Original byte (C#)  Marshalled byte (C)  UTF8.GetChars (C)
payload[0]  18                   18                  18
payload[3]  238                 -18                   0
payload[45] 215                 -41                   0
payload[80] 148                -108                  64

更新:编组的字节是正确的,尽管它们已被读取签名。封闭的问题。见评论。

0 个答案:

没有答案