gpt4 book ai didi

c# - 使用P/Invoke在套接字上发送签名的char *

转载 作者:行者123 更新时间:2023-12-03 12:05:24 24 4
gpt4 key购买 nike

我正在尝试使用PInvoke调用第三方DLL中的方法,该DLL会填充输出缓冲区,然后使用套接字将其发送到服务器。该方法具有以下签名:

int APIENTRY loop(HANDLE handle,char *in,unsigned int inLength,
char *out,unsigned outBufferSize,
unsigned *outLength);

如果我从C++应用程序调用此函数,则out缓冲区包含带符号的值,然后使用以下代码将其发送到服务器:
send(mysocket,outbuffer,outbytes,0);

我的问题是套接字。在C#中发送似乎不支持sbyte [],我认为这等效于C++非托管char *?
在我的C#程序中,我具有以下内容:
[DllImport("vbftam.dll")]
public static extern int loop(IntPtr handle, IntPtr inputBytes, uint inLength, IntPtr outputBytes, uint outBufferSize, out uint outLength);

然后,我使用以下代码调用该方法:
var outBufferPtr = Marshal.AllocHGlobal(256);
loop(handle, inBufferPtr, inBytes, outBufferPtr, 256, out outbytes)
byte[] myArray = new byte[256];
Marshal.Copy(outBufferPtr,myArray, 0, 256);

如果我将myArray发送到服务器,则返回的响应不是我所期望的,我认为这是由于myArray是未签名的,并且服务器正在期待已签名的值。

我使用以下代码生成了一个signedArray,但socket.Send没有需要sbyte []的重载。
sbyte[] signedArray = new sbyte[myArray.Length];
Buffer.BlockCopy(myArray, 0, signedArray, 0, myArray.Length);

这在C#中可能吗?如果是这样,我将如何使用套接字发送此sbyte []数组?

最佳答案

您可以将有符号数组转换为无符号数组,然后照常发送。基础数据看起来是一样的,这只是计算机对待受未签名或已签名属性影响的数据的方式。在右侧表格中的Here中,您可以看到两种表示形式具有相同的位顺序。考虑以下带符号的字节数组:[0,-1,1,127]您实际上可以发送它的无符号强制转换[0,255,1,127]并获得相同的结果。

关于c# - 使用P/Invoke在套接字上发送签名的char *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22635630/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com