2015-10-04 47 views
0

我想写二进制数据到一个文件,并将其添加为电子邮件附件。如何在目标C中编写二进制文件?

MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; 
    picker.mailComposeDelegate = self; 
    NSData *data = [[self.samples componentsJoinedByString:@"\n"] dataUsingEncoding:NSUTF8StringEncoding]; 
    [picker addAttachmentData:data mimeType:@"application/octet-stream" fileName:filename]; 

addAttachmentData期望一个NSData *要传递(虽然我宁愿一个字节数组)。样品是NSMutableArray *。我得到额外的格式,我不希望却在该文件中,像尖括号和空白:

... 
<17700000 16c0f710 c78a2660 1570f960 c78926> 
<17710060 17d0f800 c98826d0 2160f990 cb8d26> 
... 

在哪里,这些是从哪里来的?我怎样才能真正写入二进制数据?

回答

4

冷静下来。 NSData 一个字节数组 - 不多也不少。你所看到的仅仅是日志过程所做的一切。试试这个:

NSArray <NSString*>* arr = @[@"Mannie", @"Moe", @"Jack"]; 
NSData *data = 
    [[arr componentsJoinedByString:@"\n"] dataUsingEncoding:NSUTF8StringEncoding]; 
NSLog(@"%@", data); 

控制台输出:

<4d616e6e 69650a4d 6f650a4a 61636b> 

这只是NSLog的整洁使事情。字节只是2位十六进制数值;数据中没有尖括号和空格。

如果你真的不相信我,打印这种方式:

char buffer[100]; 
[data getBytes:buffer length:data.length]; 
for (NSUInteger i = 0; i < data.length; i++) { 
    NSLog(@"%02x", buffer[i]); 
} 

输出就是字符字节:

4d 
61 
6e 
6e 
69 
65 
0a 
4d 
6f 
65 
0a 
4a 
61 
63 
6b 
+0

哇,你有一个令人难以置信的声誉无光。嗯,我正在阅读发送附件作为Python中的二进制文件,并看到0x3C = 60 ='<'作为最初的字节。当我以崇高的方式打开文件时,我看到了同样的事情。 – tarabyte

+1

好的,但现在你已经改变了这个问题,不是吗?在我看来,这个问题是“我的NSData中这些额外的东西是什么?”我告诉你如何证明自己没有额外的东西。如何在电子邮件中表示八位字节流是另一回事。 – matt