2010-08-01 36 views
17

Tôi có chút mã sau đây:stringWithUTF8String thất bại, nhưng chỉ thỉnh thoảng

NSData *data = [NSData dataWithContentsOfFile:filePath options:0 error:&fileError]; 
NSString *recipe = @""; 
if (fileError == nil) { 
    recipe = [NSString stringWithUTF8String:[data bytes]]; 
    NSLog(@"Converted Recipe as: %@",recipe); 
    NSLog(@"Original Data was: %@",data); 
} else { 
    NSLog(@"Error reading file: %@", [fileError localizedDescription]); 
} 

Vấn đề là đôi khi stringWithUTF8String trả về null và đôi khi nó sẽ trả về một cách chính xác các nội dung của tập tin ... cùng một tập tin. Đôi khi nó hoạt động và đôi khi nó không. Đây là một đoạn trích từ nhật ký khi nó không .... Điều đó có nghĩa với tôi rằng tệp đọc đang hoạt động, nhưng vì lý do nào đó, chuyển đổi đã thất bại trong lần này. Nếu tôi làm điều đó một lần nữa (điều này được gọi là kết quả của một tableView didSelectRowAtIndexPath: Vì vậy, tôi chỉ có thể bấm vào một dãy ghế khác và sau đó trở lại với trang này

2010-08-01 16:14:29.031 RecipeBrowse[52056:207] Converted Recipe as: (null) 
2010-08-01 16:14:29.037 RecipeBrowse[52056:207] Original Data was: <426c6163 6b656e65 64204361 626f2046 69736820 5461636f 730a0a49 4e475245 4449454e 54533a0a 0a2d200a 0a0a4d45 54484f44 3a0a0a42 4c41434b 454e4544 20434142 4f204649 53482054 41434f53 

Bất kỳ ý tưởng làm thế nào để làm cho điều này đáng tin cậy hơn.? ?

+3

Quay lại và đọc tài liệu về xử lý lỗi. KHÔNG BAO GIỜ kiểm tra nếu lỗi không phải là không; LUÔN kiểm tra giá trị trả lại (dữ liệu trong trường hợp này) thay thế. –

Trả lời

32

+stringWithUTF8String: sẽ cho rằng đầu vào của nó là một chuỗi NUL-chấm dứt, nhưng NSData không đặt bất kỳ terminator đặc biệt đó. Thay vào đó, tạo ra chuỗi bằng cách sử dụng -initWithBytes:length:encoding:, vì bạn biết độ dài của dữ liệu.

+6

Hoặc 'initWithData: encoding:'. – Wevah

+0

+1 @Wevah: Đúng vậy, tôi đã bỏ lỡ điều đó. – JWWalker

+0

Rực rỡ, cảm ơn bạn! Điều đó dường như đã xóa sạch nó. –

5

Đã có cùng một vấn đề, initWithData: dữ liệu hoạt động cho tôi

- (NSString *)base64String { 
    NSData * data = [UIImagePNGRepresentation(self) base64EncodedDataWithOptions:NSDataBase64Encoding64CharacterLineLength]; 
    return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
} 
Các vấn đề liên quan