Objective-C 中Socket常用转换机制(NSData,NSString,int,Uint8,Uint16,Uint32,byte[])

   2023-02-09 学习力0
核心提示:最近项目中要用到socket通讯,由于涉及到组包问题,所以需要数据类型之间的来回转换,现在分享出来如果想要请教Socket的问题请留言,我会随时回答的1. int类型转16进制hexstring[objc] view plain copy//int 转16进制  - (NSString *)hexFromInt:(NSInte

最近项目中要用到socket通讯,由于涉及到组包问题,所以需要数据类型之间的来回转换,现在分享出来

如果想要请教Socket的问题请留言,我会随时回答的

1. int类型转16进制hexstring

[objc] view plain copy
  1. //int 转16进制  
  2. - (NSString *)hexFromInt:(NSInteger)val {  
  3.     return [NSString stringWithFormat:@"%X", val];  
  4. }  

 

2.16进制转换为NSData

[objc] view plain copy
  1. + (NSData *)dataFromHexString:(NSString *)hexString  
  2. {  
  3.     NSAssert((hexString.length > 0) && (hexString.length % 2 == 0), @"hexString.length mod 2 != 0");  
  4.     NSMutableData *data = [[NSMutableData alloc] init];  
  5.     for (NSUInteger i=0; i<hexString.length; i+=2) {  
  6.         NSRange tempRange = NSMakeRange(i, 2);  
  7.         NSString *tempStr = [hexString substringWithRange:tempRange];  
  8.         NSScanner *scanner = [NSScanner scannerWithString:tempStr];  
  9.         unsigned int tempIntValue;  
  10.         [scanner scanHexInt:&tempIntValue];  
  11.         [data appendBytes:&tempIntValue length:1];  
  12.     }  
  13.     return data;  
  14. }  



3.NSData转16进制

[objc] view plain copy
  1. + (NSString *)hexStringFromData:(NSData *)data  
  2. {  
  3.     NSAssert(data.length > 0, @"data.length <= 0");  
  4.     NSMutableString *hexString = [[NSMutableString alloc] init];  
  5.     const Byte *bytes = data.bytes;  
  6.     for (NSUInteger i=0; i<data.length; i++) {  
  7.         Byte value = bytes[i];  
  8.         Byte high = (value & 0xf0) >> 4;  
  9.         Byte low = value & 0xf;  
  10.         [hexString appendFormat:@"%x%x", high, low];  
  11.     }//for  
  12.     return hexString;  
  13. }  


4.NSString转int类型

[objc] view plain copy
  1. int a = [aStrinng  intValue];  


5.uint8转NSData(占两位)

[objc] view plain copy
  1. + (NSData *)byteFromUInt8:(uint8_t)val  
  2. {  
  3.     NSMutableData *valData = [[NSMutableData alloc] init];  
  4.       
  5.     unsigned char valChar[1];  
  6.     valChar[0] = 0xff & val;  
  7.     [valData appendBytes:valChar length:1];  
  8.       
  9.     return [self dataWithReverse:valData];  
  10. }  


6.uint16 转NSData(占四位)

[objc] view plain copy
  1. + (NSData *)bytesFromUInt16:(uint16_t)val  
  2. {  
  3.     NSMutableData *valData = [[NSMutableData alloc] init];  
  4.       
  5.     unsigned char valChar[2];  
  6.     valChar[0] = 0xff & val;  
  7.     valChar[1] = (0xff00 & val) >> 8;  
  8.     [valData appendBytes:valChar length:2];  
  9.       
  10.     return [self dataWithReverse:valData];  
  11. }  


7.Uint32 转NSData(占八位)

[objc] view plain copy
  1. + (NSData *)bytesFromUInt32:(uint32_t)val  
  2. {  
  3.     NSMutableData *valData = [[NSMutableData alloc] init];  
  4.       
  5.     unsigned char valChar[4];  
  6.     valChar[0] = 0xff & val;  
  7.     valChar[1] = (0xff00 & val) >> 8;  
  8.     valChar[2] = (0xff0000 & val) >> 16;  
  9.     valChar[3] = (0xff000000 & val) >> 24;  
  10.     [valData appendBytes:valChar length:4];  
  11.       
  12.     return [self dataWithReverse:valData];  
  13. }  

 

8.NSString 转NSData

[objc] view plain copy
  1. NSData *data = [aString  dataUsingEncoding:NSUTF8StringEncoding];// 通过utf-8转为data  


9.NSData转Uint8

[objc] view plain copy
  1. + (uint8_t)uint8FromBytes:(NSData *)fData  
  2. {  
  3.     NSAssert(fData.length == 1, @"uint8FromBytes: (data length != 1)");  
  4.     NSData *data = fData;  
  5.     uint8_t val = 0;  
  6.     [data getBytes:&val length:1];  
  7.     return val;  
  8. }  


10.NSData转Uint16

[objc] view plain copy
  1. + (uint16_t)uint16FromBytes:(NSData *)fData  
  2. {  
  3.     NSAssert(fData.length == 2, @"uint16FromBytes: (data length != 2)");  
  4.     NSData *data = [self dataWithReverse:fData];;  
  5.     uint16_t val0 = 0;  
  6.     uint16_t val1 = 0;  
  7.     [data getBytes:&val0 range:NSMakeRange(0, 1)];  
  8.     [data getBytes:&val1 range:NSMakeRange(1, 1)];  
  9.       
  10.     uint16_t dstVal = (val0 & 0xff) + ((val1 << 8) & 0xff00);  
  11.     return dstVal;  
  12. }  


11.NSData转Uint32

[objc] view plain copy
  1. + (uint32_t)uint32FromBytes:(NSData *)fData  
  2. {  
  3.     NSAssert(fData.length == 4, @"uint32FromBytes: (data length != 4)");  
  4.     NSData *data = [self dataWithReverse:fData];  
  5.       
  6.     uint32_t val0 = 0;  
  7.     uint32_t val1 = 0;  
  8.     uint32_t val2 = 0;  
  9.     uint32_t val3 = 0;  
  10.     [data getBytes:&val0 range:NSMakeRange(0, 1)];  
  11.     [data getBytes:&val1 range:NSMakeRange(1, 1)];  
  12.     [data getBytes:&val2 range:NSMakeRange(2, 1)];  
  13.     [data getBytes:&val3 range:NSMakeRange(3, 1)];  
  14.       
  15.     uint32_t dstVal = (val0 & 0xff) + ((val1 << 8) & 0xff00) + ((val2 << 16) & 0xff0000) + ((val3 << 24) & 0xff000000);  
  16.     return dstVal;  
  17. }  


12.NSData转Byte

[objc] view plain copy
  1. uint8_t byteArray[[data length]];  
  2.    
  3.  [data getBytes:&byteArray length:[data length]];  
  4.    
  5.   
  6.  for (int i = 0; i < [data length] ; i++ ) {  
  7.      Byte byte = byteArray[i];  
  8.      NSLog(@"--byte%x",byte);  
  9.  }  

 

13.NSData的拼接

[objc] view plain copy
  1. [data1 appendData:data2];  

 

14.NSData转int (用CFSwapInt32BigToHost)

 

[objc] view plain copy
  1. NSData *data4 = [completeData subdataWithRange:NSMakeRange(0, 4)];  
  2. int value = CFSwapInt32BigToHost(*(int*)([data4 bytes]));  

 

以上可能会用到的反转字节序列代码

[objc] view plain copy
    1. + (NSData *)dataWithReverse:(NSData *)srcData  
    2. {  
    3.     //    NSMutableData *dstData = [[NSMutableData alloc] init];  
    4.     //    for (NSUInteger i=0; i<srcData.length; i++) {  
    5.     //        [dstData appendData:[srcData subdataWithRange:NSMakeRange(srcData.length-1-i, 1)]];  
    6.     //    }//for  
    7.       
    8.     NSUInteger byteCount = srcData.length;  
    9.     NSMutableData *dstData = [[NSMutableData alloc] initWithData:srcData];  
    10.     NSUInteger halfLength = byteCount / 2;  
    11.     for (NSUInteger i=0; i<halfLength; i++) {  
    12.         NSRange begin = NSMakeRange(i, 1);  
    13.         NSRange end = NSMakeRange(byteCount - i - 1, 1);  
    14.         NSData *beginData = [srcData subdataWithRange:begin];  
    15.         NSData *endData = [srcData subdataWithRange:end];  
    16.         [dstData replaceBytesInRange:begin withBytes:endData.bytes];  
    17.         [dstData replaceBytesInRange:end withBytes:beginData.bytes];  
    18.     }//for  
    19.       
    20.     return dstData;  
 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 《黑马程序员》 category分类的使用(Objective
    分类的作用:在不改变原来类的基础上,可以给类增加一些方法。使用注意 : ①  分类只能增加方法,不可以增加成员变量                ②  分类的方法在实现中可以访问成员变量,不过成员变量必须手动实现。               
    03-16
  • Objective-C学习—UIScrollView控件使用
    Objective-C学习—UIScrollView控件使用
    一、知识点简单介绍1.UIScrollView控件是什么?(1)移动设备的屏幕⼤大⼩小是极其有限的,因此直接展⽰示在⽤用户眼前的内容也相当有限(2)当展⽰示的内容较多,超出⼀一个屏幕时,⽤用户可通过滚动⼿手势来查看屏幕以外的内容(3)普通的UIView不具备滚动功能
    03-16
  • Objective-C Runtime(转)
    博主地址: http://yulingtianxia.com/blog/2014/11/05/objective-c-runtime/曾经觉得Objc特别方便上手,面对着 Cocoa 中大量 API,只知道简单的查文档和调用。还记得初学 Objective-C 时把[receiver message]当成简单的方法调用,而无视了“发送消息”这句话
    03-08
  • iOS扩展——Objective-C开发编程规范 简单io扩展实验代码
    iOS扩展——Objective-C开发编程规范 简单io扩
      最近准备开始系统学习一个完整项目的开发流程和思路,在此之前,我们需要对iOS的开发变成规范进行更系统和详尽的学习,随意对编程规范进行了整理和学习。本文内容主要转载自:Objective-C-Coding-Guidelines-In-Chinese  此外,这篇文章所说的一些常见
    03-08
  • Objective-C利用协议实现回调函数
    实现一个显示文字为测试的视图,然后经过3秒钟测试文字变为回调函数文字。相应的截图如下:  实现的代码如下:定义协议:#import UIKit/UIKit.h @protocol NoteDelegate //回调函数 -(void)messageCallBack:(NSString *)string; @end 调用协议:#impor
    02-10
  • 刨根问底Objective-C Runtime(1)- Self & S
      刨根问底Objective-C Runtime(1)- SelfSuper - Chun Tips专注iOS开发 刨根问底Objective-C Runtime(1)- SelfSuper前言关于Objective-C Runtime一篇好的文档 : Understanding the Objective-C Runtime译文地址为: http://blog.cocoabit.com/blog/2
    02-10
  • Objective-C利用协议实现回调函数
    实现一个显示文字为测试的视图,然后经过3秒钟测试文字变为回调函数文字。相应的截图如下: 实现的代码如下:定义协议:#import UIKit/UIKit.h @protocol NoteDelegate//回调函数-(void)messageCallBack:(NSString *)string;@end  调用协议:#import Founda
    02-10
  • Objective-c开发中混合使用ARC
    首选“Compile Sources”的位置:选中工程-TARGETS-相应的target然后选中右侧的“Build Phases”,向下就找到“Compile Sources”了。如何在未使用arc的工程中引入一个使用了arc特性的文件:对相应的文件添加:-fobjc-arc参数如何在arc工程中引用未使用arc的文件
    02-10
  • Objective C运行时(runtime)技术总结,好强大
    前言:         Objective C的runtime技术功能非常强大,能够在运行时获取并修改类的各种信息,包括获取方法列表、属性列表、变量列表,修改方法、属性,增加方法,属性等等,本文对相关的几个要点做了一个小结。目录:(1)使用class_replaceMethod/cla
    02-09
  • Programming With Objective-C---- Introductio
    a:link { color: rgba(88, 114, 210, 1); text-decoration: none }a:visited { color: rgba(88, 114, 210, 1); text-decoration: none }a:hover { color: rgba(173, 189, 248, 1); text-decoration: none }a:active { color: rgba(0, 0, 255, 1); text-decora
    02-09
点击排行