这不是这两天在帮小伙伴做iOS的蓝牙协议开发嘛,使用Swift的目的是为了更快速的做一些逻辑应用,但是还是涉及到了基础数据类型的转换。iOS的数据块主要是用NSData类型,所以只好做了一常见类型转换的代码,也算是为了备忘。
需要转换的类型,主要是char和NSData互转,unsigned char和NSData互转,以及NSString和NSData转换的封装。废话懒得说,直接贴代码了。
有需要就复制黏贴过去,不过请顺便点个赞吧!
首先需要一个头文件 Convert.h
//
// Converter.h
// ObjectiveApp
//
// Created by Orlando Chen on 2021/3/24.
//
#ifndef Converter_h
#define Converter_h
#import <Foundation/Foundation.h>
@interface Converter : NSObject
// MARK: convert nsstring to nsdata
+(NSData*) cvtStringToData:(NSString*) str;
// MARK: convert nsdata to nsstring
+(NSString*) cvtDataToString:(NSData*) data;
// MARK: convert c string to nsdata
+(NSData*) cvtCStringToData:(char*) cstr length: (NSInteger) length;
// MARK: convert nsdata to c string
+(char*) cvtDataToCString:(NSData*) data;
// MARK: convert c string to nsstring
+(NSString*) cvtCStringToString:(char*) cstr length: (NSInteger) length;
// MARK: convert c byte array to nsdata
+(NSData*) cvtCBytesToData: (unsigned char*) bytes length: (NSInteger) length;
// MARK: convert nsdata to c byte array
+(unsigned char*) cvtDataToCBytes: (NSData*) data length: (NSInteger*) length_out;
@end
#endif /* Converter_h */
类实现代码 Converter.m
//
// Converter.m
// ObjectiveApp
//
// Created by Orlando Chen on 2021/3/24.
//
#import "Converter.h"
@implementation Converter
+(NSData*) cvtStringToData: (NSString*) str
{
NSData *data = nil;
if (str != nil) {
data = [str dataUsingEncoding:NSUTF8StringEncoding];
} else {
data = [[NSData init] initWithCString: "" encoding: NSUTF8StringEncoding];
}
return data;
};
+(NSString*) cvtDataToString: (NSData*) data
{
NSString *str = nil;
if (data != nil) {
str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
} else {
str = [[NSString alloc] initWithCString: "" encoding:NSUTF8StringEncoding];
}
return str;
};
// MARK: convert nsdata to ns
+(NSData*) cvtCStringToData :(char*) cstr length:(NSInteger) length
{
NSData *data = nil;
if (cstr != nil) {
data = [[NSData alloc] initWithBytes:cstr length:length];
} else {
data = [[NSData alloc] init];
}
return data;
};
// MARK: convert nsdata to c string
+(char*) cvtDataToCString: (NSData*) data
{
char* cstr = nil;
if (data != nil) {
cstr = (char*)calloc([data length] + 1, sizeof(char));
memcpy(cstr, [data bytes], [data length]);
} else {
cstr = (char*)calloc(1, sizeof(char));
}
return cstr;
};
// MARK: convert c string to nsstring
+(NSString*) cvtCStringToString:(char*) cstr length: (NSInteger) length
{
NSString* str = nil;
if (cstr != nil) {
str = [[NSString alloc] initWithBytes:cstr length:length encoding:NSUTF8StringEncoding];
} else {
str = [[NSString alloc] init];
}
return str;
}
// MARK: convert c byte array to nsdata
+(NSData*) cvtCBytesToData: (unsigned char*) bytes length: (NSInteger) length
{
NSData* data = nil;
if (bytes != nil) {
data = [[NSData alloc] initWithBytes:bytes length:length];
} else {
data = [[NSData alloc] init];
}
return data;
};
// MARK: convert nsdata to c byte array
+(unsigned char*) cvtDataToCBytes: (NSData*) data length: (NSInteger*) length_out
{
unsigned char* bytes = (unsigned char*)[data bytes];
*length_out = [data length];
return bytes;
};
@end
测试用例的main.m在这里:
//
// main.m
// ObjectiveApp
//
// Created by Orlando Chen on 2021/3/24.
//
#import <Foundation/Foundation.h>
#import "Converter.h"
// MARK: convert nsstring to nsdata
//+(NSData*) cvtStringToData:(NSString*) str;
// MARK: convert nsdata to nsstring
//+(NSString*) cvtDataToString:(NSData*) data;
// MARK: convert c string to nsdata
//+(NSData*) cvtCStringToData:(char*) cstr length: (NSInteger) length;
// MARK: convert nsdata to c string
//+(char*) cvtDataToCString:(NSData*) data;
// MARK: convert c string to nsstring
//+(NSString*) cvtCStringToString:(char*) cstr length: (NSInteger) length;
// MARK: convert c byte array to nsdata
//+(NSData*) cvtCBytesToData: (unsigned char*) bytes length: (NSInteger) length;
// MARK: convert nsdata to c byte array
//+(unsigned char*) cvtDataToCBytes: (NSData*) data length: (NSInteger*) length_out;
int main(int argc, const char * argv[]) {
@autoreleasepool {
// c string to nsstring and convert back
char* cstr1 = "string test--->\nhello, world";
NSString* str1 = [Converter cvtCStringToString:cstr1 length:strlen(cstr1)];
NSLog(@"test 1: %@", str1);
// c string to nsdata and convert back
NSData* data1 = [Converter cvtCStringToData:cstr1 length:strlen(cstr1)];
char* cstr2 = [Converter cvtDataToCString:data1];
NSLog(@"test 2: %s\n", cstr2);
// nsstring to nsdata and convert back
NSString *str2 = @"nsstring test--->\nhello, world!";
NSData* data2 = [Converter cvtStringToData:str2];
NSString *str3 = [Converter cvtDataToString:data2];
NSLog(@"test 3: %@", str3);
// c bytes converting test
unsigned char bytes[128];
for (int i = 0; i < 128; i++) {
bytes[i] = i;
}
NSData* data3 = [Converter cvtCBytesToData:bytes length:128];
NSInteger length = 0;
unsigned char* cbytes = [Converter cvtDataToCBytes:data3 length:&length];
if (cbytes != nil) {
for (NSInteger i = 0; i < length; i++) {
printf("%d ", cbytes[i]);
}
}
}
return 0;
}
输出结果如下:
2021-03-25 12:45:17.535878+0800 ObjectiveApp[40131:1778605] test 1: string test--->
hello, world
2021-03-25 12:45:17.536267+0800 ObjectiveApp[40131:1778605] test 2: string test--->
hello, world
2021-03-25 12:45:17.536358+0800 ObjectiveApp[40131:1778605] test 3: nsstring test--->
hello, world!
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 Program ended with exit code: 0
祝你顺利,别忘了点赞哟!