我正在尝试获取指向string
的指针,其中指针的类型为int
。我不确定我是否正确地做到了。我昨天刚刚发现unsafe和fixed,所以我还在质疑这一点。我可以将char*
转换为int
吗?我没有收到任何错误,但方法不起作用,所以我不确定指针是否错误或者我是否对第三方OCX做错了(对此没有支持)。
C ++调用的第三方文档:
BlobToVariant(VARIANT *pV, long BlobPointer)
WriteVToFile(VARIANT *pV)
VS2010 C#Intellisense说:
BlobToVariant(ref object v, int BlobPointer)
WriteVToFile(ref object v)
这是我的代码:
string imageBlob = "superlongstring";
// 3rd Party ActiveX control for tiff image files
TIFFLib.TIFF tiff = new TIFFLib.TIFF();
// Variant object that will hold image
object blobVariant = new object();
unsafe
{
fixed (char* p = imageBlob)
{
int blobPointer = (int)p;
tiff.BlobToVariant(ref blobVariant, blobPointer);
tiff.WriteVToFile(ref blobVariant);
}
}
答案 0 :(得分:1)
BlobToVariant
可能需要一个指向C字符串的指针;一个char*
。虽然char
是C中的1字节数据类型,但它是C#中的2字节数据类型。 C#char*
和C char*
是不同的,不兼容的类型。
您需要先使用适当的文本编码将字符串转换为字节序列。我将在这里使用UTF-8,但如果此函数不接受UTF-8输入,则应切换到其他内容。
// "using System.Text;" assumed.
byte[] imageBlobBytes = Encoding.UTF8.GetBytes(imageBlob);
现在你做了同样的事情,只有你使用byte*
,它对应于C中的char*
类型。(确切地说,它们可能在签名方面有所不同。 C#byte
类型是未签名的,C char
类型通常是签名的,但我们在此并不关心。)
// 3rd Party ActiveX control for tiff image files
TIFFLib.TIFF tiff = new TIFFLib.TIFF();
// Variant object that will hold image
object blobVariant = new object();
unsafe
{
fixed (byte* p = imageBlobBytes)
{
int blobPointer = (int)p;
tiff.BlobToVariant(ref blobVariant, blobPointer);
tiff.WriteVToFile(ref blobVariant);
}
}
请注意,这只能在32位主机上运行,如果进程以32位执行,则只能在64位主机上运行。 C#int
类型始终是32位宽,而byte*
在32位执行环境中为32位宽,在64位执行环境中为64位宽。如果在64位环境中执行,则此代码将截断指针,并且结果行为将是未定义的。