相关文章推荐
纯真的领结  ·  java getinputstream ...·  2 年前    · 
老实的显示器  ·  Linux shell脚本之 ...·  2 年前    · 
  • 基础数据类型与NSData互转
  • 基础数据类型与NSData互转
  • data.bytes

iOS 系统库提供了简便的API可以实现基础数据类型和NSData的转化,读data.bytes可以直接获取到。

以int为例:

// Int convert to NSData
int num = 10;
NSData *data = [NSData dataWithBytes:&num length:sizeof(num)];
const uint8_t *bytes = [data bytes];
// data convert to Int
int num1 = 0;
[data getBytes:&num1 length:data.length];
NSLog(@"num:%d num1:%d",num,num1);

dataWithBytes:length: 这个方法传入两个参数,第一个参数是内存地址。有了内存地址,就能够找到数据存储的首位置。第二个参数,长度,有了长度就知道数据在内存中的offet。
这样即找到了数据的起始位置,又知道了数据应该读到哪里,就能从内存中准确地读取出二进制数据来了。

getBytes:length: 这个方法读取数据的时候,得提前知道数据是什么类型的,给定一个该类型的内存地址,然后知道了需要读到哪里(offset)。然后从内存中将二进制流读出来,存储到&num1这个给定的地址下,并且存储为int类型的数据。

NSInter也可以在NSData,bytes之间转换:

NSInteger integer = 10;
NSData *integerData = [NSData dataWithBytes:&integer length:sizeof(integer)];
NSInteger integer1 = 0;
[integerData getBytes:&integer1 length:integerData.length];
NSLog(@"integer:%ld integer1:%ld",(long)integer,(long)integer1);

有想法的话可以探索一下dataWithBytes:length:方法的内部实现。

See also

  • malloc & memcpy
int num = 10;
NSData *data = [NSData dataWithBytes:&num length:sizeof(num)];
NSUInteger len = data.length;
Byte *byteData = (Byte*)malloc(len); // 分配出一个长度为len的内存地址
memcpy(byteData, data.bytes, len);   // 将长度为len 的 data.bytes 数据存储到已经分配好的内存下
  • char - NSData - NSString
char *str = "hello world";
NSData *data = [NSData dataWithBytes:str length:strlen(str)];
NSString *str1 = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

[1] How to convert NSData to byte array in iPhone? : https://stackoverflow.com/questions/724086/how-to-convert-nsdata-to-byte-array-in-iphone

OC 基础数据类型转bytes基础数据类型与NSData互转基础数据类型与NSData互转data.bytes系统方法iOS 系统库提供了简便的API可以实现基础数据类型和NSData的转化,读data.bytes可以直接获取到。以int为例:// Int convert to NSDataint num = 10;NSData *data = [NSData dataWithBytes:&num length:sizeof(num)];const uint8_t *byte Core Foundation 框架 (CoreFoundation.framework) 是一组 C 语言接口, 简称 CF. 它们为 iOS 应用程序提供基本数据管理和服务功能. 如 Core Graphics、Core Text,并且我们可能需要将 CF 对象和OC 对象进行相互化,ARC 下,编译器不会自动管理 CF 对象的内存,我们需要手动管理. 创建一个 CF 对象使用后, 需要使用 CFRelease 将其手动释放, 换句话说, Core Foundation 对象类型不在 ARC 管理范畴内. 如何将 CF 和 OC 对象有效的结合起来
- (char *)nsdataToChar:(NSData *)nsData { // nsdata直接用byteschar后面会多乱码,根据长度截取 int byte_len = (int)[nsData length]; char *tmp_char = (char*)[nsData bytes]; char *data_char = (char*)calloc(sizeof(char),byte_len+1); memcpy(data_char, tmp_c
- (instancetype)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)length freeWhenDone:(BOOL)b; 初始化对象。 不进行复制字节数组操作,直接设置字节指针为bytes,长度为length。 - (instancetype)i... NSString *strIdL  = [NSString stringWithFormat:@"%@",[[NSString alloc] initWithFormat:@"%02lx",(long)bytes[0]]]; 十六进制->十进制 NSString *rechar
最近项目中要用到socket通讯,由于涉及到组包问题,所以需要数据类型之间的来回换,现在分享出来 如果想要请教Socket的问题请留言,我会随时回答的 1. int类型16进制hexstring [objc] view plain copy //int 16进制   - (NSString *)hexFromInt:(NSInteger)val {       return [NSS...
OC HTTP Server是一款基于Objective-C语言编写的HTTP服务器,可用于iOS或Mac应用程序中。它具有轻量级、可嵌入、易用等特点。使用OC HTTP Server可以很方便地实现服务器端的API接口开发或HTTP文件传输等功能。 OC HTTP Server提供了一个HttpServer类,该类可用于创建一个HTTP服务器实例。我们可以设置监听的端口号、网络接口、资源文件目录、请求处理逻辑等参数。在处理HTTP请求时,OC HTTP Server会对请求进行解析,并将请求参数、请求头部信息、请求体等信息提取出来,开发者可以根据自己的需求进行处理和响应。 OC HTTP Server支持常见的HTTP方法,如GET、POST、PUT、DELETE等。我们可以根据请求方法和请求路径,来执行相应的逻辑操作。OC HTTP Server还提供了一些有用的内置功能,例如:路由映射、静态资源管理、访问日志等等。 总之,OC HTTP Server是一款不错的HTTP服务器框架,使用起来简单方便,配置灵活可扩展。它为iOS或Mac应用程序提供了一种快速搭建HTTP服务的解决方案。