指向int类型的字符串的指针

时间:2012-10-17 18:00:15

标签: c# asp.net string pointers unsafe

我正在尝试获取指向string的指针,其中指针的类型为int。我不确定我是否正确地做到了。我昨天刚刚发现unsafefixed,所以我还在质疑这一点。我可以将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);
    }
}

1 个答案:

答案 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位环境中执行,则此代码将截断指针,并且结果行为将是未定义的。