2012-04-16 24 views
13

He buscado. Pero todavía no pude conseguirlo.NSData a NSString devuelve nulo

Estoy convirtiendo NSdata en NSString. Cuando lo hago [data description]; me devuelve < 00000000 31323334 35363738> Sí, estoy recibiendo mi cadena @ "12345678".

¿Cómo puedo convertirlo a NSString de forma adecuada? Probé

NSString *b = [NSString stringWithUTF8String:[data bytes]]; 
NSString *a = [[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSUTF8StringEncoding]; 

Tanto me devuelve nulo. ¿Alguna idea? Gracias

Hola a todos, Gracias por todas las sugerencias. Parece ser constante por lo que siempre hay un carácter nulo delante. Así que cada vez que recibo algo, simplemente elimino el primer < 00000000>, entonces ya funciona bien

+0

Una búsqueda en SO le dará la respuesta – SomaMan

+0

hola, ¿cómo acepto la respuesta de las personas? Traté de hacer clic en la tecla de arriba, pero dice que necesito más de 15 reputación – user774150

Respuesta

26

Esto sucede si la codificación es incorrecta.

Intente utilizar ASCII para probar. ASCII casi con certeza trabaja para recuperar algún tipo de cuerda. Si solo son números, probablemente funcione.

NSString *a = [[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:NSASCIIStringEncoding]; 

más común excepto UTF-8 Enconding es:

NSASCIIStringEncoding 
NSUnicodeStringEncoding 
NSISOLatin1StringEncoding 
NSISOLatin2StringEncoding 
NSSymbolStringEncoding 

Trate de ellos y ver si funcionan.

+1

NSASCIIStringEncoding funcionó para mí. Gracias. –

6

Estoy convirtiendo NSdata en NSString. Cuando lo hago [descripción de datos]; es me devuelve < 00000000 31323334 35363738> Sí, estoy recibiendo mi cadena @ "12345678".

No, no está recibiendo esa cadena. Está recibiendo una secuencia de bytes que comienza con un grupo de valores 0x00 y va seguida de una serie de bytes que coinciden con la secuencia ASCII "12345678".

I.e. tiene datos sin procesar e intenta convertirlos a un tipo restringido, pero no puede porque el tipo restringido no puede representar los datos sin procesar.

Puede intentar usar las API de "conversión con pérdida" en NSString, pero eso podría no funcionar y sería frágil de todos modos.

¿La mejor apuesta?

Solo convierta los bytes en NSData que realmente representan la cadena a una instancia de NSString. Eso se puede hacer con -initWithBytes:length:encoding:; tendrás que hacer los cálculos para encontrar el desplazamiento y la longitud correctos.

2

Esto puede deberse a que los primeros bytes de sus datos son 00. El carácter 0 es el final del carácter de cadena. Al crear una cadena de ASCII (a partir de una matriz de caracteres o una matriz de bytes como lo hace), cuando el carácter 0 se encuentra al principio, produce una cadena vacía.

Sin embargo, espero que devuelva una instancia de NSString con 0 caracteres, y no nulo.

+1

Que una cadena termina con '0x00' solo es verdadera si es una cadena en C. Para otros tipos de cadenas, a menudo se representan como un triple de codificación, longitud y datos. Este es el caso en NSString; 0x00 no están engañando para que piense que la cadena está terminada, están desencadenando un error porque 0x00 es una secuencia de bytes sin sentido dentro de una cadena. – bbum

Cuestiones relacionadas