2011-04-14 101 views
10

我的C#代码使用托管C++包装器。为了创建这个包装类型的新对象,我需要将String的转换为Sbyte *的。一些StackOverflow.com帖子讨论了如何将字符串转换为字节[],以及将字节[]转换为字节[],但不是将字符串转换为字节*。C#:将字符串转换为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); 

然而,“字节”类型为sbyte不*。我下面尝试将字节转换到sbyte *失败:

1. Convert.ToSbyte(bytes); 
2. cast: (sbyte*) bytes; 

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

此外,请介绍引入sbyte *引起的任何副作用,我认为这是不安全的代码。

感谢, 凯文

回答

17

嗯怎么是这样的:

(没有测试它,不给我-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 
    }    
} 
+0

谢谢,Cipi。我会去尝试一下。 – 2011-04-14 20:14:55

+0

@凯文:而?它有用吗? – Cipi 2011-04-21 09:28:17

+1

@Cipi工作。 – sdm350 2012-10-19 18:21:45

2

你能做到这一点的方法:

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

一旦我转换为sbytes [],如何从sbytes []转换到sbyte *?简单的演员表不起作用。 Ty – 2011-04-14 16:36:53

+0

你见过我的回答吗? :| – Cipi 2011-04-14 17:10:54

3

sbyte []和sbyte *几乎是相同的东西(差不多)

sbyte [] str1; sbyte * str2;

& STR1 [0]是指向字符的阵列的第一个元素 STR2是指向一个char,这大概有一堆以下它连续字符的,随后是空终止

如果使用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