NSData与CString的无损转化

该博客介绍了如何在Objective-C中实现NSData与CString之间的无损转化,特别是在面对NSData可能存在''字符时,通过使用memcpy确保数据完整,避免字符截断。详细步骤包括从NSString到NSData,再到cstring,然后回转为NSData,最终验证转化前后数据的一致性。


    NSString *testStr = @"ZhangJian\0Ping";   //首先我们假设这个NSString就是由NSData转化过来的

    NSData* content1 = [testStr dataUsingEncoding:NSUTF8StringEncoding]; // 由这个假设的string生成NSData

    NSString *result = [[NSString allocinitWithData:content1  encoding:NSUTF8StringEncoding]; //  再转回去,看看是否有损失  log之后发现没有损失

    char *tempChar = new char[result.length+1];  ///  生成buff

    memcpy(tempChar, [result cStringUsingEncoding:NSUTF8StringEncoding], result.length);  // 进行内存拷贝,此处一定要进行内存拷贝,万万不可strcp,因为string是以'\0'

//为结束符,如果NSData的内部恰巧有这么个东西,你就惨了

    std::string tempStr1= string (tempChar, testStr.length); //  利用Buff生成Cstring,注意,此处也不可以直接用char *生成,因为内部还是可能有结束符

    NSData *content2 = [NSData dataWithBytes:tempStr1.c_str() length:testStr.length];  // 此处再将Cstring转换回NSDatalog比较data内容,发现内容一致

    NSLog(@"result %@ ",result);

    NSLog(@"length is %d",result.length);

    NSLog(@"content1 %@",content1);

    NSLog(@"content2 %@",content2);

    [result release];  ///  最最最重要,千万要释放内存,要不然多次调用内存泄露是大问题

    delete [] tempChar;


如上所示,通过这样的转化,就可以让cstring与NSData进行无损转化,当你在不清楚NSData中存储的内容的时候,很容易就会出现'\0'的情况,如果不用memcpy函数,就可能造成字符的截断,导致转换过程提前结束,其实解决的办法也不是很难,就是通过一个长度来保存字节流的长度,这样的转化才能保证数据不丢失,可以

下面附上打印log

result ZhangJian

length is 14

content1 <5a68616e 674a6961 6e005069 6e67>

content2 <5a68616e 674a6961 6e005069 6e67>


从log来看,在   NSString *testStr = @"ZhangJian\0Ping"; 转化成result 这个NSString的时候,虽然打印的的result是断的,但是我们发现它的长度是正确的。

可能上面描述的有点乱

下面解释下:

目的是NSData转化成Cstring,并且确保不丢失数据(防止NSData中存在'\0'的情况)

应该是这样转化NSData->NSString->char *->CString.

因为手头没有适合的,内部正好存在'\0'的NSData,首先就由NSString构造一个NSData,再继续上面的步骤。

最后用CString的tempStr1来生成一个新的NSData,比较两个NSData的内存数据,发现相同。

这个目的就是为了保证在出现特殊的情况下,也能保证NSData与CString的正常转化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值