我需要将字节数组从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
更新:编组的字节是正确的,尽管它们已被读取签名。封闭的问题。见评论。