NSData:

Nsdata里面可以放很多类型,可以放string类型,可以放十六进制数据,可以放十进制数据,可以放二进制数据等等等。

在oc中,主要与十进制数据打交道。在网络传输中,我们可以讲十进制数据封装在nsdata中传输,也可以讲字符串封在nsdata中传输。但是有些单芯片设备,比如蓝牙传输,无法讲字符串封装在nsdata中传输。这时候我们就只能用最底层的数据传输了。二进制,八进制,十进制,十六进制。

假设,我们用十进制传输:我们可以把传输的十进制的每个数字分别代表什么拟定出来,然后双方根据这个规则去做事情,这就是协议。我们知道十进制0-255之间的数字都占1个字节。那么我可以:int a = 27;协议里面定好27代表开锁的意思。那么int转为nsdata 然后传输nsdata到锁里面,锁里面根据协议 解析出来十进制,发现是27就会进行开锁操作。

假设,我们用十六进制传输:我们把传输的每一个十六进制的数字代表什么意思拟定协议。我们又知道,十六进制是两位占一个字节(二进制是八位占一个字节:8个二进制位构成1个字节),比如0x01。0x表示16进制,十六进制的01其实就是十进制的数字1。01代表开锁,那么我们可以用两种方式去把01封装到nsdata里面。

第一种:采用c语言btye,因为在oc中,我们有表示十进制数字的int long等类型来赋值十进制数字,像int一样赋值之后转换为nsdata就可以了。但是却没有表示十六进制的类型来赋值数组封装成nsdata。要想直接用十六进制赋值然后转换成nsdata,就只能用c语言的btye数组来做。btye数组可以不进直接放十六进制,也可以放二进制,十进制数据类型。

第二种:采用十六进制字符串形式封装(原理其实还是byte),此方法如下:因为你无法直接在oc中找到赋值十六进制的类型,所以你可以将十六进制的数据直接用字符串方式写出来,赋值给字符串,然后用这个方法帮你写到nsdata中,并且会是以十六进制类型写入。


#pragma mark 16进制字符串转换为data类型
+ (NSMutableData *)convertHexStrToData:(NSString *)str {if (!str || [str length] == 0) {return nil;}NSMutableData *hexData = [[NSMutableData alloc] initWithCapacity:8];NSRange range;if ([str length] %2 == 0) {range = NSMakeRange(0,2);} else {range = NSMakeRange(0,1);}for (NSInteger i = range.location; i < [str length]; i += 2) {unsigned int anInt;NSString *hexCharStr = [str substringWithRange:range];NSScanner *scanner = [[NSScanner alloc] initWithString:hexCharStr];[scanner scanHexInt:&anInt];NSData *entity = [[NSData alloc] initWithBytes:&anInt length:1];[hexData appendData:entity];range.location += range.length;range.length = 2;}return hexData;
}

为什么要用十六进制数据?

由于数据在计算机中的表示,最终以二进制的形式存在,所以有时候使用二进制,可以更直观地解决问题。但,二进制数太长了。比如int 类型占用4个字节,32位。
比如100,用int类型的二进制数表达将是:0000 0000 0000 0000 0110 0100面对这么长的数进行思考或操作,没有人会喜欢。因此,C,C++ 没有提供在代码直接写二进制数的方法。用16进制或8进制可以解决这个问题。因为,进制越大,数的表达长度也就越短。

一个字节可以用多少位的十六进制表示?

一个字节=8位(bit)
二进制用字母B表示,十六进制用H表示。
十进制的数码:1到9和0
十六进制的数码有1,2,3,4,5,6,7,8,9,A(10),B(11),C(12),D(13),E(14),F(15)
二进制只有0和1两个数,最大的八位二进制数就是8个1,即11111111。
所以:
11111111 B(二进制)
=255 D(十进制):个十百~3位
=FF H(十六进制):个十~2位

1,一个字节包含8个二进制位
2,一个十六进制可表示4个二进制位
3,所以,一个字节可以由2个十六进制表示

iOS如何定义byte数组,写入读取?

使用的是C语言里面的编写方式:其中byte可以用char效果也是一样的,(type 'Byte *' (aka 'unsigned char *'))
byte:unit8,无符号8bit整数,相当于char
oc中:
typedef unsigned char UInt8;
typedef UInt8 Byte;

char vs unsigned char
相同点:在内存中都是一个字节,8位(2^8=256),都能表示256个数字
不同点:char的最高位为符号位,因此char能表示的数据范围是-128~127,unsigned char没有符号位,因此能表示的数据范围是0~255

byte数组:里面一般存放字节.在十六进制使用的时候会用到
1、定义: 100表示长度,设置为0,可以控制不出现乱码
Byte data[100] = {0};//意思是data里面有100个字节,因为c中byte和java中不一样,btye定义就是char类型,8位一个字节类型,所以data[0]中只能放一个字节,不能放多个字节。
data[0] = 0x00;
data[1] = 0x55;
data[2] = 0x05;

也可以这么写:Byte byte[] = {0x00,0x55,0x05};
2、通过NSData把Byte所有内容取出来,进行读取
NSData *data1 = [NSData dataWithBytes:data length:CmdDataSetSize];//CmdDataSetSize是有效字节长度,意思是data中有100个字节,比如我们需要其中的前50个,那么这个CmdDataSetSize就是50,转后的data1的长度也是50
NSLog(@"测试%@",data1);
3、对某一个字节进行设置.
data[5] = 0x66;
NSLog(@"测试data%@",data);

nsdata和byte数组转换?

Byte *testByte = (Byte *)[data bytes];

NSData *data = [NSData dataWithBytes:testByte length:sizeof(testByte)];
//sizeof()是c语言的一个函数,返回testbyte的字节长度
//testByte也可以是char类型,因为:
typedef unsigned char UInt8;
typedef UInt8 Byte;

Demo地址

https://github.com/jiashuchang/ByteTest
转载自: https://www.jianshu.com/p/283425ff575f

iOS之NSData和字节学习相关推荐

  1. iOS工程师2021年应该学习一下Vapor

    iOS工程师2021年应该学习一下Vapor Swift席卷了编程领域.它是目前发展最快的语言之一.云计算每天都在改变世界,现在您可以使用Swift语言的强大功能和简单性来创建支持云的应用程序. Va ...

  2. 18.我在乐字节学习的第六天(Java)

    今天是我在乐字节学习的第六天,俗话说得好:Java学的好,就业加薪来的早,哈哈,这也就是我个人经过这几天学习之后才发现,其实学习编程关键是要找到一种合适的语言,我也是刚刚入门,跟吴岳老师学习这几天下来 ...

  3. iOS开发60分钟入门学习精华

    有过脚本开发经验的人(如Javascript,PHP,Shell)在刚开始学习iOS开发的时候,会觉得iOS开发的学习曲线比脚本语言要高,是的,这种感觉是对的.因为学iOS开发,不仅是学习一门新语言, ...

  4. [iOS开发]AFNetworking源码学习

    目录 简介 开始解读 核心类 AFURLSessionManger 作用 属性和接口方法 代理 AFURLSessionManagerTaskDelegate _AFURLSessionTaskSwi ...

  5. (0044) iOS 开发之SDWebImage 深度学习其源码和原理

    闲着没事看了SDWebImage的源码.清晰了它的原理. SDWebImage 深度学习 1.它是iOS图片加载框架 它支持从网络中下载且缓存图片,并设置图片到对应的UIImageView控件或者UI ...

  6. iOS开发面试—四面字节iOS客户端抖音隐私合规团队

    一面 (1h30min) 自我介绍 什么时候接触iOS开发,学习路径 属性修饰符,nonnull这些也问了,strong,weak的区别,copy strong和copy一样吗 assign的语义,答 ...

  7. 蓝懿ios 技术内容交流和学习心得 11.13

    今天讲了Json字符串的解析方法: 1.首先要要清楚Json字符串是由字典和数组组成,首先要从字符串中把字符串的第一层字典取出来使用date和下列方法: NSData*data = [NSDatada ...

  8. iOS - Swift NSData 数据

    前言 public class NSData : NSObject, NSCopying, NSMutableCopying, NSSecureCodingpublic class NSMutable ...

  9. ionic+angularJS+iOS混合开发app的学习资料介绍和基本步骤(干货)

    ionic+angularJS+iOS 先安装nodejs.npm.angularJS和ionic 其中nodeJS和npm安装可以到官网下载nodeJS,然后双击安装就好很简单(网址: http:/ ...

最新文章

  1. TX Text Control文字处理教程(13)实现拖放操作
  2. 五元一次方程组计算器_人教版初中数学七年级下册列一元一次不等式解实际问题公开课优质课课件教案视频...
  3. Educational Codeforces Round 117 (Rated for Div. 2)
  4. 10、jeecg 默认为空的字段值是如何被填充的?
  5. C语言return关键字
  6. 【BZOJ】1015 [JSOI2008]星球大战starwar(并查集+离线处理)
  7. 50道编程小题目之【企业利润提成】
  8. mysql要将语句反复执行15次_MySQL多表查询疑问
  9. 4小时学会雅达利游戏,AI需要几台电脑?
  10. 计算机网络自顶向下第七版第四章答案,《计算机网络·自顶向下方法》第七版 第四章 课后习题与问题 答案...
  11. Delphi xe5 StyleBook的用法(待续)
  12. 2022软件测试技能 Fiddler HTTP抓包调试工具完整详细教程
  13. 逍遥模拟器(8.0.x版本,系统安卓7.1)安装xposed
  14. 工地上的这些工种工资差距很大,你知道是哪些工种吗?
  15. STM32玩转物联网实战篇:01.网络通信前准备
  16. [bootstrap]如何使用modal
  17. 奇兔recovery卡刷教程_奇兔Recovery(安卓手机刷机助手)V8.2.1.4 最新版
  18. 【机器学习】当贝叶斯、奥卡姆和香农一起来定义机器学习时
  19. 英语思维导图大全 前言(一)
  20. 美拍高颜值短视频一键解析批量保存到电脑中

热门文章

  1. 支付宝小程序组件传参,父组件调用子组件方法ref
  2. 【单片机毕业设计】【mcuclub-jk-006】基于单片机的医院输液的设计
  3. 输入npm相关命令,电脑没有反应问题
  4. JavaScript实现ZLOGO子集: 前进+转向
  5. UESTC-1057 秋实大哥与花
  6. Python实现图片裁剪的两种方式——Pillow和OpenCV
  7. 数据结构自动组卷系统设计文档
  8. Mac访问河北教育考试院教资报名信息页
  9. BIM模型、倾斜摄影模型、3D模型对比
  10. Android类似电商类的多级选择