Monday 30 October 2017

Nsstring To Nsdata Binary Options


IOS 7: Base64 Codificar y decodificar objetos NSData y NSString Con la versión de iOS 7, Apple añadió soporte para codificar y decodificar datos utilizando Base64. En este post vamos a recorrer dos ejemplos usando Base64 para codificar y decodificar tanto NSData y NSString objetos. En primer lugar, crearemos un objeto NSString generado por Base64 que codifica un objeto NSData. Esto será seguido por la descodificación de la Base64 NSString de nuevo en un objeto NSData. Mostraremos los datos de NSString, tanto codificados como decodificados para asegurarnos de que todo está bien. El segundo ejemplo codificará y decodificará NSData a / desde Base64. Este ejemplo es relevante si tiene un objeto NSData que necesita ser codificado en Base64, o necesita decodificar un objeto NSData de Base64 (por cualquier razón). Cree un objeto NSString codificado en Base64 Let8217s comienzan por codificar un objeto NSData en Base64 y devolver un objeto NSString: Lector tenga cuidado: este post forma parte de la antigua era Objective-C en Cocoa with Love. No guardo estos artículos actualizados así que el código se puede romper o substituir por APIs más nuevas. Theres una buena información, pero theres también algunas opiniones que ya no respaldan mantener una mente escéptica. Lea Una nueva era para Cocoa with Love for more. En plataformas Unix, un enfoque común para la codificación Base64 es usar libcrypto (la librería OpenSSL). Sin embargo, al igual que la mayoría de las bibliotecas C, es necesario que se integre con los tipos de datos Objective-C (como NSData y NSString) y no está disponible en el iPhone. Le mostraré cómo manejar la codificación / decodificación de base64 con OpenSSL y sin que usted pueda manejar el Mac y el iPhone por igual. Introducción Base64 es una codificación para transferir datos binarios en texto de 7 bits. Originalmente utilizado en el correo electrónico. También se utiliza para la codificación binaria de datos en archivos HTML. Otro uso común para Base64 es en la autenticación HTTP Basic Access donde se utiliza para transferir detalles de inicio de sesión (que pueden no ser caracteres imprimibles). La librería clave para manejar Base64 en Mac es normalmente libcrypto (la librería OpenSSL), por lo que es un poco decepcionante que libcrypto no esté disponible en el iPhone. Utilizando OpenSSL A través de la línea de comandos En Mac, puede manejar tareas de codificación simples como la codificación base64 con OpenSSL en la línea de comandos: da el resultado de la codificación: Dev vs Dev: Convertir entero a binario como NSString Hace poco estaba trabajando en un proyecto donde Quería mostrar un valor entero como una cadena binaria en Objective-C. Una vez que escribí lo que pensé eran dos implementaciones decentes, tenía curiosidad por ver cómo otro desarrollador se acercaría al mismo problema. Le pregunté a Nick Lockwood si estaría preparado para codificar algo similar. Tenga en cuenta los requisitos muy limitados fueron proporcionados por adelantado. La solución podría ser la función C, un método o una categoría, y la firma para la llamada era indefinida. Siga leyendo para ver cuatro variaciones únicas de cómo convertir un valor entero en un objeto binario NSString. Tome 1: convertir entero a binario como NSString (John) Dado que esto es algo que se creó para ayudar con la depuración, el rendimiento wasn8217t una consideración primaria. Sin embargo, todavía me tomó el tiempo ver si podía llegar a algo que era único y sería relativamente eficiente también. En mi primer paso, decidí usar una matriz basada en C y rellenar cada elemento de la matriz por enmascarar el bit más a la derecha del entero entrante. Entonces cambio el valor entrante a la derecha, y vuelvo a través del mismo lazo. Cuando John me pidió que creara un método para dar salida a una cadena binaria de un número entero, mi primer instinto fue, por supuesto, para comprobar el desbordamiento de pila. Soy programador y disfruto solucionando problemas de programación, pero siempre he pensado que es mejor gastar el esfuerzo en resolver nuevos problemas, no los que ya están resueltos. Yo esperaba que hubiera una solución integrada, tal vez utilizando el método NSString stringWithFormat: o NSNumberFormatter. Me sorprendió descubrir que no había. Como aprendí de este hilo de la pregunta. Algunos compiladores C incluyen una opción b en sus implementaciones printf para imprimir cadenas binarias, pero no es una característica estándar y no está incluida en la implementación incluida con Mac o iOS. Antes de resolver el problema de la generación de la cadena, quería pensar en cómo sería la interfaz de código. Cuando imprime un número como una cadena, usualmente uso stringWithFormat: o NSNumberFormatter, así que idealmente I8217d como mi formato binario para atar en uno de estos mecanismos. NSNumberFormatter no parece apoyar ningún medio para ampliar las opciones de formato. Por supuesto, podría agregar propiedades de formateo adicionales usando una categoría, pero para poder usarlas tendría que swizzle el método stringFromNumber:, que es un hack demasiado lejos para mi gusto. El método stringWithFormat: es igualmente no extensible. Puede crear descripciones personalizadas para las clases de Objective-C reemplazando su método de descripción, pero el método swizzling NSNumber8217s para devolver una cadena binaria obviamente sería una mala idea (rompería el código que espera devolver una cadena decimal) y crear un La clase personalizada para envolver un número entero sólo para que pueda imprimir parece un grado absurdo de sobre-ingeniería. Encontré mención de una característica prometedora en glib llamado registerprintffunction () que permite especificar caracteres de formato printf personalizados. Hay un ejemplo de esto aquí. Lamentablemente, registerprintffunction () doesn8217t parecen implementarse en Mac o iOS 8211 presumiblemente it8217s considerado un riesgo de seguridad, o simplemente wasn8217t una prioridad. Me resigné que no habría ninguna manera no hacky de integrar el formateador de cadenas binario en los mecanismos de formateo de Objective-C existentes, y se volvió al problema en sí: Había numerosas soluciones para generar realmente la cadena binaria en la página de desbordamiento de pila Encontrados antes, pero se sentían como muy 8220C-like8221 soluciones. Decidí escribir algo desde cero que hace más uso de métodos y tipos de Cacao para mejorar la legibilidad. Se sacrifica un poco de rendimiento bruto en el proceso, pero a menos que el rendimiento se especifica como un requisito, prefiero optimizar la claridad del código en primer lugar. Aquí está mi solución:

No comments:

Post a Comment