Tutti i codici di questa risposta sono frammenti di pseudo-codice, è necessario convertire gli algoritmi in Objective-C o in un'altra lingua.
La tua domanda solleva molte domande ... si inizia con:
Ho un oggetto NSData. Devo convertire i suoi byte in una stringa e inviarli come JSON. la descrizione restituisce hex ed è inaffidabile (secondo vari manifesti SO).
Questo sembra suggerire che si desidera codificare i byte come una stringa, pronto per la decodifica di nuovo al byte all'altra estremità. Se questo è il caso si dispone di una serie di scelte, come ad esempio Base 64 codifica ecc Se si desidera qualcosa di semplice che si può solo codificare ogni byte come valore esadecimale a due caratteri, pseudo codice contorno:
NSMutableString *encodedString = @"".mutableCopy;
foreach aByte in byteData
[encodedString appendFormat:@"%02x", aByte];
Il il formato %02x
indica due cifre esadecimali con padding zero. Ciò si traduce in una stringa che può essere inviata come JSON e decodificata facilmente dall'altra parte. La dimensione del byte sul filo sarà probabilmente pari a con una lunghezza doppia rispetto al byte in cui UTF-8 è la codifica consigliata per JSON sul filo.
Tuttavia, in risposta a una delle risposte si scrive:
ma ho bisogno assolutamente i bit prime.
Cosa intendi con questo? Il tuo ricevitore interpreterà la stringa JSON che ottiene come una sequenza di byte grezzi? Se è così, hai un numero di problemi da affrontare. Le stringhe JSON sono un sottoinsieme di stringhe JavaScript e sono memorizzate come UCS-2 o UTF-16, ovvero sono sequenze di valori a 16 bit e non di valori a 8 bit. Se codifichi ciascun byte in un carattere in una stringa, verrà rappresentato utilizzando 16 bit, se il tuo ricevitore può accedere al flusso di byte deve saltare sempre un altro byte. Naturalmente se il ricevitore accede alle stringhe un carattere alla volta, ogni carattere di 16 bit può essere troncato su un byte di 8 bit. Ora si potrebbe pensare che se si segue questo approccio, ogni byte di 8 bit può essere emesso come carattere come parte di una stringa, ma ciò non funzionerà. Mentre tutti i valori 1-255 sono punti codice Unicode validi e JavaScript/JSON consentono NUL (valore 0) nelle stringhe, non tutti i valori sono stampabili, non è possibile inserire una virgola doppia "
in una stringa senza sfuggirli e la fuga carattere è \
- tutti questi dovranno essere codificati nella stringa.Faresti finisce con qualcosa di simile:
NSMutableString *encodedString = @"".mutableCopy;
foreach aByte in byteData
if (isprint(aByte) && aByte != '"' && aByte != '\\')
[encodedString appendFormat:@"%c", aByte];
otherwise
[encodedString appendFormat:@"\\u00%02x", aByte]; // JSON unicode escape sequence
Questo produrrà una stringa che quando analizzato da un decoder JSON vi darà un carattere (16-bit) per ogni byte, i primi 8 bit di essere pari a zero. Tuttavia se si passa questa stringa a un encoder JSON sarà codificare le sequenze di escape Unicode, che sono già codificati ... Così si ha realmente bisogno di inviare questa stringa oltre il filo da soli per evitare questo ...
Confuso ? Diventando complicato? Bene, perché stai cercando di inviare dati di byte binari come una stringa? Non dici mai qual è il tuo obiettivo di alto livello o cosa, se non altro, è noto sui dati di byte (ad esempio rappresenta carattere in qualche codifica)
Se questo è davvero solo un array di byte, perché non inviarlo come matrice di numeri JSON - un byte è solo un numero compreso tra 0 e 255. Per fare questo è necessario utilizzare il codice lungo le linee di:
NSMutableArray *encodedBytes = [NSMutableArray new];
foreach aByte in byteData
[encodedBytes addObject:@(aByte)]; // add aByte as an NSNumber object
Ora passano encodedBytes
-NSJSONSerialisation
e invierà una matrice JSON di numeri attraverso il cavo, il ricevitore invertire il processo di confezionamento ogni byte di nuovo in un byte buffer e hai indietro i tuoi byte.
Questo metodo evita tutti i problemi di stringhe, codifiche e fughe valide.
HTH
è 'imageData' l'oggetto NSData ed è rappresentabile dati come stringa JSON? – vadian
In che formato vuoi inserire i byte? Codici esadecimali? Stringa codificata Base-64? Che cosa? – rmaddy
Una stringa per JSON, sì. Per il titolo. – quantumpotato