Objective C——NSData与C Bytes转换

这不是这两天在帮小伙伴做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

祝你顺利,别忘了点赞哟!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值