Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从NSString到NSData的转换_Ios_Nsstring_Nsdata - Fatal编程技术网

Ios 从NSString到NSData的转换

Ios 从NSString到NSData的转换,ios,nsstring,nsdata,Ios,Nsstring,Nsdata,假设我有一些字符串: NSString *someString = @"123"; 然后,我将此字符串转换为NSData的实例,如下所示: NSData *someData = [NSData dataWithBytes:[someString UTF8String] length:[someString length]]; 据我所知,NSData本质上只是一个编码较少的比特流。我的问题是:NSData是否通过检查长度参数的值来确定每个UTF8字符串中有多少位?换句话说,[someStrin

假设我有一些字符串:

NSString *someString = @"123";
然后,我将此字符串转换为NSData的实例,如下所示:

NSData *someData = [NSData dataWithBytes:[someString UTF8String] length:[someString length]];
据我所知,NSData本质上只是一个编码较少的比特流。我的问题是:NSData是否通过检查长度参数的值来确定每个UTF8字符串中有多少位?换句话说,[someString UTF8String]返回一个包含字符“123”的C字符串,[someString length]返回整数3。NSData是否理解每个字符必须由8位组成?我完全没有抓住要点吗


谢谢。

length
返回字符串的长度,就像在“Unicode字符数”中一样,它不会返回其备份存储中的字节数

要将NSString转换为NSData,您必须使用以下内容:

NSString *someString = @"123";
NSData *someData = [someString dataUsingEncoding:NSUTF8StringEncoding];
您所做的工作适用于只包含ASCII的UTF8,因为即使在UTF8中,ASCII字符也只占用1个字节。巧合的是,字符串的“逻辑”长度与其备份存储的大小相匹配

尝试使用包含ASCII范围以外字符的字符串,您将看到不同的结果:

NSString *asciiString = @"123";
NSLog(@"\"%@\" - Length: %ld", asciiString, (long)[asciiString length]);
NSData *asciiData = [asciiString dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"Data length: %ld", [asciiData length]);

NSString *utf8String = @"No.

+ (id)dataWithBytes:(const void *)bytes length:(NSUInteger)length
NSString*ascistring=@“123”;
NSLog(@“\”%@\“-长度:%ld”,ascistring,(长)[ascistring长度];
NSData*asciiData=[asciiString数据使用编码:NSUTF8StringEncoding];
NSLog(@“数据长度:%ld”,[asciiData长度]);

NSString*utf8String=@“
length
返回字符串的长度,如在“Unicode字符数”中,它不返回其备份存储中的字节数

要将NSString转换为NSData,您必须使用以下内容:

NSString *someString = @"123";
NSData *someData = [someString dataUsingEncoding:NSUTF8StringEncoding];
您所做的工作适用于只包含ASCII的UTF8,因为即使在UTF8中,ASCII字符也只占用1个字节。巧合的是,字符串的“逻辑”长度与其备份存储的大小相匹配

尝试使用包含ASCII范围以外字符的字符串,您将看到不同的结果:

NSString *asciiString = @"123";
NSLog(@"\"%@\" - Length: %ld", asciiString, (long)[asciiString length]);
NSData *asciiData = [asciiString dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"Data length: %ld", [asciiData length]);

NSString *utf8String = @"No.

+ (id)dataWithBytes:(const void *)bytes length:(NSUInteger)length
NSString*ascistring=@“123”;
NSLog(@“\”%@\“-长度:%ld”,ascistring,(长)[ascistring长度];
NSData*asciiData=[asciiString数据使用编码:NSUTF8StringEncoding];
NSLog(@“数据长度:%ld”,[asciiData长度]);
NSString*utf8String=@“否

这个方法只需要两个参数:指向内存中字节流的void指针和长度,即从这个字节流中取多少到NSData对象。这个方法和其他方法一样,不知道也不关心如何得到这个字节流,当然也不知道关于UTF8String的任何信息,它只关心数据类型,它们是否匹配方法签名

正如Matthias所解释的,你关于如何确定字符串长度的想法也是错误的。使用strlenc函数来实现这一点。此函数在字符串终止时检查空字符\0。

这个方法只需要两个参数:指向内存中字节流的void指针和长度,即从这个字节流中取多少到NSData对象。这个方法和其他方法一样,不知道也不关心如何得到这个字节流,当然也不知道关于UTF8String的任何信息,它只关心数据类型,它们是否匹配方法签名


正如Matthias所解释的,你关于如何确定字符串长度的想法也是错误的。使用strlenc函数来实现这一点。此函数在字符串终止时检查空字符\0。

您读过我写的任何内容吗?哈哈-请重读,然后回答我的问题。另外,dataWithBytes:length:可以很好地将NSString转换为NSData。您的代码和我的代码产生相同的结果。-另外,我也不想用刺耳的语气来结束对话。然后试着用一根不仅包含ASCIIAh的字符串。我懂了。说得好。不过,你能回答我的问题吗?你读过我写的东西吗?哈哈-请重读,然后回答我的问题。另外,dataWithBytes:length:可以很好地将NSString转换为NSData。您的代码和我的代码产生相同的结果。-另外,我也不想用刺耳的语气来结束对话。然后试着用一根不仅包含ASCIIAh的字符串。我懂了。说得好。尽管如此,你能回答我的问题吗?是的,我现在明白了。谢谢你澄清这一点。我已经做了大约5年的iOS开发人员,我有点尴尬,因为我不知道其中的区别编辑:啊,我明白为什么我现在感到困惑了-这段时间我一直觉得它是位,而不是字节(对于第一个参数)-现在一切都有意义了,再次感谢。是的,我现在明白了。谢谢你澄清这一点。我已经做了大约5年的iOS开发人员,我有点尴尬,因为我不知道其中的区别编辑:啊,我明白为什么我现在感到困惑了——这段时间我一直觉得它是位,而不是字节(对于第一个参数)——现在一切都有意义了,再次感谢。