Char *和[MarshalAs(UnmanagedType.LPStr)]

罗丹

活跃成员
已加入
2015年4月7日
留言内容
41
编程经验
10+
我必须将字节值发送到期待char *的C dll,这显然是不允许的。做了一些搜索,我应该用[MarshalAs(UnmanagedType.LPStr)]字符串myBytes替换char *

很好,但是我试图找出如何从字节数组中创建字符串的方式,即字符串中的每个字符都代表原始字节值,而不是十进制值的三位数字符串。例如如果我将0xFF转换为字符串,则最终得到的字符串为"255".

可能只是我起床太晚了(下午有午睡),但我无法将头缠住它。无论如何,这是我要整理的实际代码。

C#:
[DllImport("libpigpiod_if.so", EntryPoint = "i2c_write_device")]     //This is an example of how to call a method / function in a c library from c#
public static extern int i2c_write_device(uint handle, [MarshalAs(UnmanagedType.LPStr)] string buf, uint count);

The original C definition is
int i2c_read_device(unsigned handle, char *buf, unsigned count);

那么如何从两个字节(如0x84和0xB8)中选择合适的字符串呢?
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,523
地点
悉尼,澳大利亚
编程经验
10+
例如。
var bytes = new[] {0x84, 0xB8};
var chars = Array.ConvertAll(bytes, Convert.ToChar);
var str = new string(chars);

如果您想知道,这是:
var chars = Array.ConvertAll(bytes, Convert.ToChar);


在功能上等效于此:
var chars = Array.ConvertAll(bytes, ch => Convert.ToChar(ch));
 

罗丹

活跃成员
已加入
2015年4月7日
留言内容
41
编程经验
10+
谢谢,我明天再试试。一整天都被RL困住了,今晚我有一个天文外展活动,所以还没有机会尝试。

看起来,如果我要为Pigpio创建包装器,那么我还必须为所有使用char *的方法包装器。也许让程序员提供一个字节数组,然后在方法包装器中将其转换为字符串,最后转换为p / invoke方法。
 

罗丹

活跃成员
已加入
2015年4月7日
留言内容
41
编程经验
10+
在相关说明中。有没有一种简单的方法可以将字节列表传递给方法?我注意到在共享库中(我认为它只是C),您可以使用花括号传递字节,并且接收方会自动将其视为字节数组。像这样的伪代码(不知道C sytnax)。

C#:
MyCall({0x22,0xF8});

Receiver(byte[] bytes)
{
    DoStuff;
}

我一直无法在C#中找到任何类似的东西,而且看来我必须以常规方式声明并填充字节数组,然后将其用作要发送的参数。是否有像C中一样的速记方式(或者可能是C ++,我自己无法分辨出区别)。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,523
地点
悉尼,澳大利亚
编程经验
10+
C#无法指定字节文字,但是如果您将数组声明为字节类型,则数值将被解释为字节,例如
MyCall(new byte[] {0x22,0xF8});

Receiver(byte[] bytes)
{
    DoStuff;
}
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,523
地点
悉尼,澳大利亚
编程经验
10+
在VB.NET中,您可以简单地通过用大括号将逗号分隔的值列表包装起来来表示数组。这是对该语言的相当新的补充。在C#中,您至少还需要'new []',在这种情况下,将从值中推断类型。在这种情况下,类型将被推断为“ int”,这是不带小数点的默认数字,因此必须明确指定“ byte”。

请注意,只有在初始化显式类型的变量时,例如,您才可以使用大括号来表示数组。
// Valid
byte[] a = { 0x22, 0xF8 };

// Not valid
var b = { 0x22, 0xF8 };

// Not valid
byte[] c;
c = { 0x22, 0xF8 };
 
最佳 底部