2011-04-14 24 views
10

Mi código C# utiliza una envoltura de C++ administrado. Para hacer un nuevo objeto de este tipo de Wrapper, necesito convertir String a Sbyte *. Algunas publicaciones de StackOverflow.com trataban sobre cómo convertir String en byte [], así como byte [] en sbyte [], pero no String to sbyte *.C#: Conversión de cadena a Sbyte *

msdn.social.com ofrece consejos sobre cómo convertir una matriz de bytes en una cadena:

>   // 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); 

Sin embargo, "bytes" no es de tipo sbyte *. Mis siguientes intentos para convertir bytes a SByte * fallado:

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

aconsejarme sobre cómo convertir una cadena de C# para un sbyte *.

Además, hable de los efectos secundarios de la introducción de sbyte *, que creo que es un código inseguro.

Gracias, Kevin

Respuesta

17

Hmmm ¿qué tal algo como esto:

(ni de prueba que, no me da -1 si doesnt trabajo, simplemente creo que debería) :))

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

Gracias, Cipi. Voy a probar esto. –

+0

@Kevin: ¿Y? ¿Funcionó? – Cipi

+1

@Cipi Esto funciona. – sdm350

2

Puede hacerlo de esa manera:

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

Una vez que convierto a sbytes [], ¿cómo puedo convertir de sbytes [] para SByte *? Un simple elenco no funciona. Ty –

+0

¿Has visto mi respuesta? : | – Cipi

3

sbyte [] y sbyte * son casi lo mismo (casi)

sbyte [] str1; sbyte * str2;

& str1 [0] es un puntero al primer elemento de la matriz de caracteres str2 es un puntero a un char, que presumiblemente tiene un montón de caracteres consecutivos siguientes que, seguido de un terminador nulo

si usa str1 como una matriz, conoce la longitud sin un terminador nulo. pero si quiere pasar str1 a una cadena api que requiere sbyte *, usa & str1 [0] para convertirlo en un sbyte *, y luego elimina la información de la longitud de la matriz, por lo que debe hacer que surja null terminado.

La respuesta de Cipi muestra cómo convertir una matriz en un puntero, C# hace que sea difícil usar punteros, a propósito. en C o C++, las matrices y punteros son similares.

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