最近項目中要用到socket通訊,由于涉及到組包問題,所以需要數據類型之間的來回轉換,現在分享出來
如果想要請教Socket的問題請留言,我會隨時回答的 1. int類型轉16進制hexstring
[objc] view plaincopy
-?(NSString?*)hexFromInt:(NSInteger)val?{??????return?[NSString?stringWithFormat:@"%X",?val];??}?? ?
2.16進制轉換為NSData
[objc] view plaincopy
+?(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進制
[objc] view plaincopy
+?(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];??????}????return?hexString;??}??
4.NSString轉int類型
[objc] view plaincopy
int?a?=?[aStrinng??intValue];??
5.uint8轉NSData(占兩位)
[objc] view plaincopy
+?(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(占四位)
[objc] view plaincopy
+?(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(占八位)
[objc] view plaincopy
+?(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
[objc] view plaincopy
NSData?*data?=?[aString??dataUsingEncoding:NSUTF8StringEncoding];
9.NSData轉Uint8
[objc] view plaincopy
+?(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
[objc] view plaincopy
+?(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
[objc] view plaincopy
+?(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
[objc] view plaincopy
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的拼接
[objc] view plaincopy
[data1?appendData:data2];?? ?
14.NSData轉int (用CFSwapInt32BigToHost)
?
[objc] view plaincopy
NSData?*data4?=?[completeData?subdataWithRange:NSMakeRange(0,?4)];??int?value?=?CFSwapInt32BigToHost(*(int*)([data4?bytes]));?? ?
以上可能會用到的反轉字節序列代碼
[objc] view plaincopy
+?(NSData?*)dataWithReverse:(NSData?*)srcData??{????????????????????????????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];??????}??????????return?dstData;??}?
總結
以上是生活随笔為你收集整理的Objective-C 中Socket常用转换机制(NSData,NSString,int,Uint8,Uint16,Uint32,byte[])的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。