2012-04-16 32 views
13

Tôi đã tìm kiếm. Nhưng vẫn không thể có được nó.NSData để NSString trả về Null

Tôi đang chuyển đổi NSdata thành NSString. Khi tôi làm [data description]; , nó trả về cho tôi < 00000000 31323334 35363738> Có, Im nhận được chuỗi của tôi @ "12345678".

Làm cách nào để chuyển đổi nó thành NSString một cách thích hợp? Tôi đã thử

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

Cả hai đều trả về giá trị rỗng. Bất kỳ ý tưởng nào? Cảm ơn

Xin chào tất cả, Cảm ơn mọi đề xuất. Có vẻ như liên tục theo đó luôn có một dấu gạch ngang ký tự rỗng. Vì vậy, bất cứ khi nào tôi nhận được một cái gì đó, tôi chỉ cần xóa < 00000000> đầu tiên, sau đó làm việc tốt của nó đã được

+0

Tìm kiếm trong SO sẽ giúp bạn có được câu trả lời – SomaMan

+0

hi there, làm cách nào để tôi chấp nhận câu trả lời của mọi người? Tôi đã thử bấm vào phím lên nhưng nó nói rằng tôi cần nhiều hơn 15 danh tiếng – user774150

Trả lời

26

Điều này xảy ra nếu mã hóa không chính xác.

Hãy thử sử dụng ASCII để kiểm tra. ASCII gần như chắc chắn làm việc để retrive somekind của chuỗi. Nếu nó chỉ là con số thì có lẽ nó sẽ hoạt động.

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

Phổ biến nhất trừ UTF-8 enconding là:

NSASCIIStringEncoding 
NSUnicodeStringEncoding 
NSISOLatin1StringEncoding 
NSISOLatin2StringEncoding 
NSSymbolStringEncoding 

thử chúng ra và xem nếu họ làm việc.

+1

NSASCIIStringEncoding làm việc cho tôi. Cảm ơn bạn. –

6

Tôi đang chuyển đổi NSdata thành NSString. Khi tôi làm [mô tả dữ liệu]; nó trả lại cho tôi < 00000000 31323334 35363738> Có, Im nhận được chuỗi của tôi @ "12345678".

Không - bạn không nhận được chuỗi đó. Bạn nhận được một chuỗi byte bắt đầu với một loạt các giá trị 0x00 và được theo sau bởi một chuỗi các byte xảy ra tương ứng với chuỗi ASCII "12345678".

I.e. bạn có dữ liệu thô và đang cố gắng chuyển đổi nó thành một loại bị ràng buộc, nhưng không thể vì loại ràng buộc không thể đại diện cho dữ liệu thô.

Bạn có thể thử sử dụng API "chuyển đổi mất dữ liệu" trên NSString, nhưng điều đó có thể không hoạt động và sẽ mong manh.

Đặt cược tốt nhất?

Chỉ chuyển đổi các byte trong NSData thực sự đại diện cho chuỗi thành một thể hiện của NSString. Điều đó có thể được thực hiện với -initWithBytes:length:encoding:; bạn sẽ cần phải thực hiện các phép tính để tìm độ chính xác và độ dài.

2

Điều này có thể do byte đầu tiên của dữ liệu của bạn là 00. Ký tự 0 là phần cuối của ký tự chuỗi. Khi tạo một chuỗi từ ASCII (từ một mảng ký tự hoặc một mảng các byte như bạn đang làm), khi ký tự 0 được gặp lúc đầu, nó tạo ra một chuỗi rỗng.

Tuy nhiên, tôi hy vọng nó sẽ trả lại phiên bản NSString với 0 ký tự và không phải là rỗng.

+1

Đó là một chuỗi được chấm dứt bởi '0x00' chỉ đúng nếu nó là một chuỗi C. Đối với các loại chuỗi khác, chúng thường được biểu diễn dưới dạng mã hóa, độ dài và dữ liệu gấp ba lần. Đây là trường hợp trong NSString; 0x00 của không lừa nó vào suy nghĩ chuỗi được chấm dứt, họ đang gây ra một lỗi vì 0x00 là một chuỗi byte vô nghĩa trong một chuỗi. – bbum