objective-c – 将NSData字节转换为NSString?

objective-c – 将NSData字节转换为NSString?,第1张

概述我试图使用 BEncoding ObjC class来解码.torrent文件。 NSData *rawdata = [NSData dataWithContentsOfFile:@"/path/to/the.torrent"];NSData *torrent = [BEncoding objectFromEncodedData:rawdata]; 当我NSLog种子我得到以下: { a 我试图使用 BEncoding ObjC class来解码.torrent文件。

NSData *rawdata = [NSData dataWithContentsOffile:@"/path/to/the.torrent"];NSData *torrent = [BEnCoding objectFromEncodedData:rawdata];

当我NSLog种子我得到以下:

{    announce = <68747470 3a2f2f74 6f727265 6e742e75 62756e74 752e636f 6d3a3639 36392f61 6e6e6f75 6e6365>;    comment = <5562756e 74752043 44207265 6c656173 65732e75 62756e74 752e636f 6d>;    "creation date" = 1225365524;    info =     {        length = 732766208;        name = <7562756e 74752d38 2e31302d 6465736b 746f702d 69333836 2e69736f>;        "pIEce length" = 524288;....

如何将名称转换为Nsstring?我努力了..

NSData *info = [torrent valueForKey:@"info"];NSData *name = [info valueForKey:@"name"];unsigned char aBuffer[[name length]];[name getBytes:aBuffer length:[name length]];NSLog(@"file name: %s",aBuffer);

..它检索数据,但似乎有额外的unicode垃圾后:

file name: ubuntu-8.10-desktop-i386.iso)

我也试过了(from here)..

Nsstring *secondtry = [Nsstring stringWithCharacters:[name bytes] length:[name length] / sizeof(unichar)];

..但这似乎返回一堆随机字符:

扵湵畴㠭ㄮⴰ敤歳潴⵰㍩㘸椮潳

事实上,第一种方式(如苹果文档中提到的)返回大部分数据正确,与一些额外的字节使我认为这可能是一个错误在BEnCoding库..但我对ObjC的不了解更有可能是有过错..

解决方法

06000

When I NSLog torrent I get the following:

06001

那将是一个NSDictionary,然后,不是一个NSData。

06002

..which retrives the data,but seems to have additional unicode rubbish after it:

06003

不,它检索的文件名很好;你只是打印不正确。 %s采用C字符串,以null结尾;数据对象的字节不是空终止的(它们只是字节,不一定是任何编码中的字符,0-作为字符为空 – 是完全有效的字节)。您必须再分配一个字符,并将数组中的最后一个字符设置为0:

size_t length = [name length] + 1;unsigned char aBuffer[length];[name getBytes:aBuffer length:length];aBuffer[length - 1] = 0;NSLog(@"file name: %s",aBuffer);

但null终止一个NSData对象中的数据是错误的(除非你真的需要一个C字符串)。我会马上得到正确的方式。

I have also trIEd […]..

06005

..but this seems to return random Chinese characters:

06006

这是因为你的字节是UTF-8,它编码一个字符(通常)一个字节。

unichar是和stringWithCharacters:length:accept,UTF-16。在该编码中,一个字符(通常)为两个字节。 (因此除以sizeof(unichar):它将字节数除以2以获得字符数。)

所以你说“这里有一些UTF-16数据”,它去了,从每两个字节字符;每对字节应该是两个字符,而不是一个,所以你有垃圾(结果是大多是CJK表意文字)。

You answered your own question很好,除了stringWithUTF8String:比stringWithCString:enCoding:for UTF-8编码的字符串更简单。

然而,当你有长度(就像你有一个NSData),使用initWithBytes更简单,更合适:length:enCoding:。它更容易,因为它不需要null终止的数据;它只是使用你已经有的长度。 (不要忘记释放或自动释放它。)

总结

以上是内存溢出为你收集整理的objective-c – 将NSData字节转换为NSString?全部内容,希望文章能够帮你解决objective-c – 将NSData字节转换为NSString?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1047541.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存