此答案中的所有代碼都是僞代碼片段,您需要自行將算法轉換爲Objective-C或其他語言。
你的問題提出了許多問題......你開始:
我有一個NSData對象。我需要將其字節轉換爲字符串並以JSON形式發送。描述返回十六進制,並且不可靠(根據各種SO海報)。
這似乎暗示要編碼字節作爲一個字符串,準備回另一端進行解碼,以字節爲單位。如果是這種情況下,你有多種選擇,如基地-64編碼等。如果你想要的東西簡單,你可以只是每個字節編碼爲兩個字符的十六進制值,僞代碼大綱:
NSMutableString *encodedString = @"".mutableCopy;
foreach aByte in byteData
[encodedString appendFormat:@"%02x", aByte];
的格式%02x
表示具有零填充的兩個十六進制數字。這會產生一個字符串,它可以以JSON的形式發送,並且很容易在另一端進行解碼。導線上的字節大小爲,可能爲字節長度的兩倍,因爲UTF-8是JSON在導線上的推薦編碼。
但是響應的回答一個你寫的:
但我需要絕對的原始位。
這是什麼意思?您的接收器是否會將它獲取的JSON字符串解釋爲一系列原始字節?如果是這樣,你有一些問題需要解決。 JSON字符串是JavaScript字符串的子集,存儲爲UCS-2或UTF-16,即它們是16位值序列,不是8位值。如果您將每個字節編碼爲字符串中的字符,則它將使用16位表示,如果您的接收器可以訪問字節流,則必須跳過其他字節。當然,如果接收者每次訪問一個字符時,每個16位字符可以被截斷回8位字節。現在你可能會認爲如果你採取這種方法,那麼每個8位字節可以作爲字符串的一部分輸出,但這不起作用。雖然所有值1-255都是有效的Unicode字符代碼點,而JavaScript/JSON允許字符串中的NUL(0值),但並非所有這些值都是可打印的,您不能將雙引號"
放入字符串中而不會將其轉義,並且轉義字符是\
- 所有這些都需要編碼到字符串中。你最終的東西,如:
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
這將產生一個字符串,當由JSON解析解碼器會給你的每一個字節一個字符(16位),前8位是零。 但是如果這個字符串傳遞給JSON編碼器將編碼的Unicode轉義序列,其已經被編碼......所以,你真的需要通過電線自己避免這種發送此字符串...
困惑?變得複雜?那麼你爲什麼要嘗試將二進制字節數據作爲字符串發送?你永遠不會說你的高級目標是什麼,或者什麼都知道字節數據(例如,它代表某種編碼中的字符)
如果這實際上只是一個字節數組,那麼爲什麼不發送它作爲JSON數組數組 - 一個字節只是0-255範圍內的一個數字。要做到這一點,你會沿着線的使用代碼:
NSMutableArray *encodedBytes = [NSMutableArray new];
foreach aByte in byteData
[encodedBytes addObject:@(aByte)]; // add aByte as an NSNumber object
現在通過encodedBytes
到NSJSONSerialisation
,它會發送號碼的JSON陣列上線,接收器將扭轉過程中包裝每個字節回一個字節緩衝區,你有你回來的字節。
該方法避免了有效字符串,編碼和轉義的所有問題。
HTH
來源
2015-08-14 11:20:47
CRD
是'imageData'的NSData對象,是數據可表示爲json字符串? – vadian
你想要什麼格式的字節?十六進制碼? Base-64編碼的字符串?什麼? – rmaddy
JSON的字符串,是的。根據標題。 – quantumpotato