C#:将字符串转换为Sbyte* < >我的C代码使用托管C++包装器。要创建此包装器类型的新对象,我需要将字符串转换为Sbyte*。一些StackOverflow.com帖子讨论了如何将字符串转换为字节[],以及如何将字节[]转换为sbyte[],而不是将字符串转换为sbyte*

C#:将字符串转换为Sbyte* < >我的C代码使用托管C++包装器。要创建此包装器类型的新对象,我需要将字符串转换为Sbyte*。一些StackOverflow.com帖子讨论了如何将字符串转换为字节[],以及如何将字节[]转换为sbyte[],而不是将字符串转换为sbyte*,c#,unmanaged,C#,Unmanaged,msdn.social.com提供了有关如何将字节数组转换为字符串的建议: > // convert String to Sbyte* > string str = "The quick brown, fox jumped over the gentleman."; > > System.Text.ASCIIEncoding encoding = new > System.Text.ASCII

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);
但是,“字节”不是sbyte*类型。以下将字节转换为sbyte*的尝试失败:

请告诉我如何将C#字符串转换为sbyte*

另外,请谈谈引入sbyte*的任何副作用,我认为这是不安全的代码

谢谢, 凯文

你可以这样做:

sbyte[] sbytes = Array.ConvertAll(bytes, q => Convert.ToSByte(q));

嗯,像这样的怎么样:

(没有测试它,不要给我-1如果它不起作用,我只是相信它应该):)


sbyte[]和sbyte*几乎是一样的东西

sbyte[]str1; sbyte*str2

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

如果使用str1作为数组,则知道不带空终止符的长度。但是,如果要将str1传递给需要sbyte*的字符串api,可以使用&str1[0]将其转换为sbyte*,然后去掉数组长度信息,因此必须使sure以null结尾

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



一旦转换为sbytes[],如何从sbytes[]转换为sbyte*?简单的强制转换不起作用。Ty@KevinMeredith数组中的第一项是sbyte*->sbyte*b=&sbytes[0]谢谢,Cipi。我去试试这个。
sbyte[] sbytes = Array.ConvertAll(bytes, q => Convert.ToSByte(q));
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
    }               
}