C#: 将字符串转换为 Sbyte*

14

我使用了一个托管的C++包装器来编写我的C#代码。要创建此包装器类型的新对象,我需要将String转换为Sbyte*。一些StackOverflow.com帖子讨论了如何将String转换为byte[]以及byte[]转换为sbyte[],但没有涉及String到sbyte*的转换。

msdn.social.com提供了有关如何将字节数组转换为字符串的建议:

>         // convert String to Sbyte*
>         string str = "The quick brown, fox jumped over the gentleman.";
>     
>         System.Text.ASCIIEncoding encoding = new
>         System.Text.ASCIIEncoding();
>
>         Byte[] bytes = encoding.GetBytes(str);
然而,"bytes"不是sbyte*类型。我尝试将bytes转换为sbyte*的多次尝试都失败了。
1. Convert.ToSbyte(bytes);
2. cast:  (sbyte*) bytes;
请指导我如何将C#字符串转换为sbyte*。另外,请谈论引入sbyte*的任何副作用,我相信这是不安全的代码。
谢谢, Kevin
3个回答

20

这个怎么样:

(我没有测试过,如果无法工作,请不要给我-1,我只是认为它应该可以) :))

string str = "The quick brown fox jumped over the gentleman.";
byte[] bytes = Encoding.ASCII.GetBytes(str);


unsafe 
{
    fixed (byte* p = bytes)
    {
        sbyte* sp = (sbyte*)p;  
        //SP is now what you want
    }               
}

谢谢,Cipi。我会去尝试一下的。 - Kevin Meredith

6
你可以这样做:
sbyte[] sbytes = Array.ConvertAll(bytes, q => Convert.ToSByte(q));

1
一旦我转换为sbytes [],如何从sbytes []转换为sbyte *?简单的强制转换不起作用。谢谢。 - Kevin Meredith
@KevinMeredith 数组中的第一项是 sbyte* -> sbyte* b = &sbytes[0] - Darkgaze

3

sbyte[]和sbyte*几乎是相同的(几乎)

sbyte[] str1; sbyte* str2;

&str1[0]是指向字符数组第一个元素的指针 str2是指向字符的指针,它后面可能有一堆连续的字符,然后是一个空终止符

如果您将str1用作数组,则可以在没有空终止符的情况下知道长度。但是,如果要将str1传递给需要sbyte*的字符串API,则使用&str1[0]将其转换为sbyte*,然后剥离掉数组长度信息,因此您必须确保您已经添加了空终止符。

Cipi的答案向您展示了如何将数组转换为指针,在C#中使用指针很难,这是有意的。在C或C ++中,数组和指针是类似的。

http://www.lysator.liu.se/c/c-faq/c-2.html
http://pw1.netcom.com/~tjensen/ptr/pointers.htm


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接