Objective-C 中Socket常用转换机制(NSData,NSString,int,Uint8,Uint16,Uint32,byte[])
最近项目中要用到socket通讯,由于涉及到组包问题,所以需要数据类型之间的来回转换,现在分享出来
1. int类型转16进制hexstring
- //int 转16进制
- - (NSString *)hexFromInt:(NSInteger)val {
- return [NSString stringWithFormat:@"%X", val];
- }
2.16进制转换为NSData
- + (NSData *)dataFromHexString:(NSString *)hexString
- {
- NSAssert((hexString.length > 0) && (hexString.length % 2 == 0), @"hexString.length mod 2 != 0");
- NSMutableData *data = [[NSMutableData alloc] init];
- for (NSUInteger i=0; i<hexString.length; i+=2) {
- NSRange tempRange = NSMakeRange(i, 2);
- NSString *tempStr = [hexString substringWithRange:tempRange];
- NSScanner *scanner = [NSScanner scannerWithString:tempStr];
- unsigned int tempIntValue;
- [scanner scanHexInt:&tempIntValue];
- [data appendBytes:&tempIntValue length:1];
- }
- return data;
- }
3.NSData转16进制
- + (NSString *)hexStringFromData:(NSData *)data
- {
- NSAssert(data.length > 0, @"data.length <= 0");
- NSMutableString *hexString = [[NSMutableString alloc] init];
- const Byte *bytes = data.bytes;
- for (NSUInteger i=0; i<data.length; i++) {
- Byte value = bytes[i];
- Byte high = (value & 0xf0) >> 4;
- Byte low = value & 0xf;
- [hexString appendFormat:@"%x%x", high, low];
- }//for
- return hexString;
- }
4.NSString转int类型
- int a = [aStrinng intValue];
5.uint8转NSData(占两位)
- + (NSData *)byteFromUInt8:(uint8_t)val
- {
- NSMutableData *valData = [[NSMutableData alloc] init];
- unsigned char valChar[1];
- valChar[0] = 0xff & val;
- [valData appendBytes:valChar length:1];
- return [self dataWithReverse:valData];
- }
6.uint16 转NSData(占四位)
- + (NSData *)bytesFromUInt16:(uint16_t)val
- {
- NSMutableData *valData = [[NSMutableData alloc] init];
- unsigned char valChar[2];
- valChar[0] = 0xff & val;
- valChar[1] = (0xff00 & val) >> 8;
- [valData appendBytes:valChar length:2];
- return [self dataWithReverse:valData];
- }
7.Uint32 转NSData(占八位)
- + (NSData *)bytesFromUInt32:(uint32_t)val
- {
- NSMutableData *valData = [[NSMutableData alloc] init];
- unsigned char valChar[4];
- valChar[0] = 0xff & val;
- valChar[1] = (0xff00 & val) >> 8;
- valChar[2] = (0xff0000 & val) >> 16;
- valChar[3] = (0xff000000 & val) >> 24;
- [valData appendBytes:valChar length:4];
- return [self dataWithReverse:valData];
- }
8.NSString 转NSData
- NSData *data = [aString dataUsingEncoding:NSUTF8StringEncoding];// 通过utf-8转为data
9.NSData转Uint8
- + (uint8_t)uint8FromBytes:(NSData *)fData
- {
- NSAssert(fData.length == 1, @"uint8FromBytes: (data length != 1)");
- NSData *data = fData;
- uint8_t val = 0;
- [data getBytes:&val length:1];
- return val;
- }
10.NSData转Uint16
- + (uint16_t)uint16FromBytes:(NSData *)fData
- {
- NSAssert(fData.length == 2, @"uint16FromBytes: (data length != 2)");
- NSData *data = [self dataWithReverse:fData];;
- uint16_t val0 = 0;
- uint16_t val1 = 0;
- [data getBytes:&val0 range:NSMakeRange(0, 1)];
- [data getBytes:&val1 range:NSMakeRange(1, 1)];
- uint16_t dstVal = (val0 & 0xff) + ((val1 << 8) & 0xff00);
- return dstVal;
- }
11.NSData转Uint32
- + (uint32_t)uint32FromBytes:(NSData *)fData
- {
- NSAssert(fData.length == 4, @"uint32FromBytes: (data length != 4)");
- NSData *data = [self dataWithReverse:fData];
- uint32_t val0 = 0;
- uint32_t val1 = 0;
- uint32_t val2 = 0;
- uint32_t val3 = 0;
- [data getBytes:&val0 range:NSMakeRange(0, 1)];
- [data getBytes:&val1 range:NSMakeRange(1, 1)];
- [data getBytes:&val2 range:NSMakeRange(2, 1)];
- [data getBytes:&val3 range:NSMakeRange(3, 1)];
- uint32_t dstVal = (val0 & 0xff) + ((val1 << 8) & 0xff00) + ((val2 << 16) & 0xff0000) + ((val3 << 24) & 0xff000000);
- return dstVal;
- }
12.NSData转Byte
- uint8_t byteArray[[data length]];
- [data getBytes:&byteArray length:[data length]];
- for (int i = 0; i < [data length] ; i++ ) {
- Byte byte = byteArray[i];
- NSLog(@"--byte%x",byte);
- }
13.NSData的拼接
- [data1 appendData:data2];
14.NSData转int (用CFSwapInt32BigToHost)
- NSData *data4 = [completeData subdataWithRange:NSMakeRange(0, 4)];
- int value = CFSwapInt32BigToHost(*(int*)([data4 bytes]));
以上可能会用到的反转字节序列代码
- + (NSData *)dataWithReverse:(NSData *)srcData
- {
- // NSMutableData *dstData = [[NSMutableData alloc] init];
- // for (NSUInteger i=0; i<srcData.length; i++) {
- // [dstData appendData:[srcData subdataWithRange:NSMakeRange(srcData.length-1-i, 1)]];
- // }//for
- NSUInteger byteCount = srcData.length;
- NSMutableData *dstData = [[NSMutableData alloc] initWithData:srcData];
- NSUInteger halfLength = byteCount / 2;
- for (NSUInteger i=0; i<halfLength; i++) {
- NSRange begin = NSMakeRange(i, 1);
- NSRange end = NSMakeRange(byteCount - i - 1, 1);
- NSData *beginData = [srcData subdataWithRange:begin];
- NSData *endData = [srcData subdataWithRange:end];
- [dstData replaceBytesInRange:begin withBytes:endData.bytes];
- [dstData replaceBytesInRange:end withBytes:beginData.bytes];
- }//for
- return dstData;
- }
Objective-C 中Socket常用转换机制(NSData,NSString,int,Uint8,Uint16,Uint32,byte[])相关推荐
- 开发中list常用转换
开发中list常用转换: 1.将list转换为逗号分隔的字符串 org.apache.commons.lang3.StringUtils.join(applyNameList, ",&quo ...
- iOS中NSDate常用转换操作整合
//当前时间格式化, 例:YYYY-MM-dd-EEEE-HH:mm:ss + (NSString *)getCurrentDataWithDateFormate:(NSString *)format ...
- golang中int int8 int16 int32 int64 uint8 uint16 uint32 uint64 占用字节和取值范围
================================ go grpc-go 相关技术专栏 总入口 go语言基础知识总结.整理.收藏 ========================== ...
- OC中的常用数据类型
计算机中的文件分为"二进制文件"和"文本文件",其中图片.视频.音频等就是二进制文件,像".txt"的文件就是文本文件.客户端与服务器端,或 ...
- python中socket模块常用吗_python网络学习笔记——socket模块使用记录
此文章记录了笔者学习python网络中socket模块的笔记. 建议初次学习socket的读者先读一遍socket模块主要函数的介绍. socket模块的介绍可以参考笔者的前一篇关于socket官方文 ...
- python中socket模块常用吗_python中socket模块详解
socket模块简介 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket.socket通常被叫做"套接字",用于描述IP地址和端口,是一个通信 ...
- FME进阶视频教程: FME常用转换器之坐标系操作类,讲解在FME中如何操作矢量数据的坐标系
教程简介 本FME进阶视频教程精选工作中使用频率较高的转换器.数据格式读写.其他能提高FME使用水平的技巧及功能进行细致的讲解,而且在教程讲解过程中使用的数据及模板都可以配套下载,通过边看视频教程边对 ...
- Swift - 从ALAsset中获取照片的原图并转换成NSData
ALAsset类代表相册中的每个资源文件,可以通过它获取照片的相关信息,及其对应的原图,全屏图,缩略图等. 当我们想通过一个照片的ALAsset对象,来获取这张照片的原图并将其转换成NSData数据, ...
- 计算机常用计数制什么意思,计算机中的常用计数制及转换.PPT
计算机中的常用计数制及转换 上海交通大学网络教育学院---计算机基础 计算机应用基础 上海交通大学网络教育学院 高万萍 Email: wpgao@sjtu.edu.cn 课程简介 计算机应用基础课程共 ...
最新文章
- 把jquery的this写入选择器里(伪写入)哈哈~
- android 挂载 nfs工具,Android 挂载 NFS
- 阿里数据库内核月报:2017年04月
- 【设计模式 00】设计模式的六大原则
- imsi序列号_IPhone 获取IMSI序列号
- APP自动化测试系列之Appium介绍及运行原理
- 一文了解 Java 应用程序性能优化指南
- 《我的第一本算法书》读书笔记
- gis统计百分比_ArcGIS数据统计
- 串联稳压电源与多谐振荡器
- C语言程序代码 25 编程实现将任意一个华氏法表示的温度,转换为以摄氏法表示的温度。
- SpringBoot/SpringMVC整合Shiro:实现登录与注册(MD5加盐加密)
- 全球及中国直播平台市场发展分析及投资战略规划报告2023-2030年
- Portainer-docker可视化工具
- 帝国搜索模板不支持php,解决帝国CMS搜索模板不支持灵动标签的方法
- 阿里云服务器被攻击的危害有多大
- 36氪发布《2021年中国电子签名行业研究报告》,法大大成行业头部代表
- 互联网+智慧景区智慧旅游服务与运营项目建设解决方案
- Adobe XD 交互原型15个小技巧,一看就会
- HeartBeatClassification------------数据分析
热门文章
- Asp.Net性能优化.
- 使用 Castle ActiveRecord
- 蛋白提取纯化的方法、注意事项及常见问题解答
- 原创:pta做题笔记:注意数组大小大一点!//准考证号,试机座位,考试座位查询
- sql 日期和当前日期时间差_如何通过excel获取当前的日期和时间
- linux虚拟主机有哪几种实现方案?_常见的国内外Linux服务器控制面板介绍
- 激光SLAM学习--移动机器人技术系列课(智东西)
- 计算机视觉与深度学习 | 基于DNN神经网络实现人的年龄及性别预测(代码类)
- 【转】VC窗口刷新InvalidateRect和UpdateWindow RedrawWindow
- python横坐标如何显示为月份_如何显示给定两个日期之间的所有月份?