美文网首页
iOS 16进制字符串和NSData、NSString互转

iOS 16进制字符串和NSData、NSString互转

作者: huangxiongbiao | 来源:发表于2017-04-19 19:57 被阅读779次

背景:

当app与硬件交互时,双方写入读取数据的协议都是根据字节位数来的,写入读出数据解析时,使用NSString,NSData的16进制互转方便解析提高代码编写速度。

代码如下:
.h文件===============

#import <Foundation/Foundation.h>

@interface NSData (Category)

+(NSData*)dataWithHexString:(NSString*)str;

+(NSString*)hexStringWithData:(NSData*)data;

+ (NSData *)DESEncrypt:(NSData *)data WithKey:(NSString *)key;

+ (NSData *)DESDecrypt:(NSData *)data WithKey:(NSString *)key;

+ (NSData *)threeDESDecrypt:(NSData *)data WithKey:(NSString *)key;

@end

.m文件===============

#import "NSData+Category.h"

@implementation NSData (Category)

#pragma mark-----将十六进制数据转换成NSData
+(NSData*)dataWithHexString:(NSString*)str{
    
    if (!str || [str length] == 0) {
        return nil;
    }
    
    NSMutableData *hexData = [[NSMutableData alloc] initWithCapacity:8];
    NSRange range;
    if ([str length] % 2 == 0) {
        range = NSMakeRange(0, 2);
    } else {
        range = NSMakeRange(0, 1);
    }
    for (NSInteger i = range.location; i < [str length]; i += 2) {
        unsigned int anInt;
        NSString *hexCharStr = [str substringWithRange:range];
        NSScanner *scanner = [[NSScanner alloc] initWithString:hexCharStr];
        
        [scanner scanHexInt:&anInt];
        NSData *entity = [[NSData alloc] initWithBytes:&anInt length:1];
        [hexData appendData:entity];
        
        range.location += range.length;
        range.length = 2;
    }
    return hexData;
    
}

#pragma mark - 将传入的NSData类型转换成NSString并返回
+(NSString *)hexStringWithData:(NSData *)data
{
    const unsigned char* dataBuffer = (const unsigned char*)[data bytes];
    if(!dataBuffer){
        return nil;
    }
    NSUInteger dataLength = [data length];
    NSMutableString* hexString = [NSMutableString stringWithCapacity:(dataLength * 2)];
    for(int i = 0; i < dataLength; i++){
        [hexString appendString:[NSString stringWithFormat:@"%02lx", (unsigned long)dataBuffer[i]]];
    }
    NSString* result = [NSString stringWithString:hexString];
    return result;
    
}

//DES加密
+ (NSData *)DESEncrypt:(NSData *)data WithKey:(NSString *)key
{
    //    char keyPtr[kCCKeySizeAES256+1];
    //    bzero(keyPtr, sizeof(keyPtr));
    //
    //    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
    const void *keyPtr = (const void *) [[NSData dataWithHexString:key] bytes];
    
    NSUInteger dataLength = [data length];
    //    NSLog(@"%ld",dataLength);
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    size_t numBytesEncrypted = 0;
    
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,
                                          kCCOptionPKCS7Padding | kCCOptionECBMode,
                                          keyPtr, kCCBlockSizeDES,
                                          NULL,
                                          [data bytes], dataLength,
                                          buffer, bufferSize,
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:8];
    }
    
    free(buffer);
    return nil;
}
//DES解密
+ (NSData *)DESDecrypt:(NSData *)data WithKey:(NSString *)key
{
    //    char keyPtr[kCCKeySizeAES256+1];
    //    bzero(keyPtr, sizeof(keyPtr));
    //
    //    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    const void *keyPtr = (const void *) [[NSData dataWithHexString:key] bytes];
    
    NSUInteger dataLength = [data length];
    
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    
    size_t numBytesDecrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES,
                                          kCCOptionPKCS7Padding | kCCOptionECBMode,
                                          keyPtr, kCCBlockSizeDES,
                                          NULL,
                                          [data bytes], dataLength,
                                          buffer, bufferSize,
                                          &numBytesDecrypted);
    
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
    }
    
    free(buffer);
    return nil;
}

+ (NSData *)threeDESDecrypt:(NSData *)data WithKey:(NSString *)key
{
    NSString *key1 = [key substringWithRange:NSMakeRange(0, 16)];
    NSString *key2 = [key substringFromIndex:key.length-16];
    
    NSData *data1 = [self DESDecrypt:data WithKey:key1];
    NSData *data2 = [self DESEncrypt:data1 WithKey:key2];
    NSData *data3 = [self DESDecrypt:data2 WithKey:key1];
    return data3;
    
}

@end

相关文章

网友评论

      本文标题:iOS 16进制字符串和NSData、NSString互转

      本文链接:https://www.haomeiwen.com/subject/asbhzttx.html