iOS 16進制字符串和NSData裸诽、NSString互轉(zhuǎn)

背景:

當app與硬件交互時,雙方寫入讀取數(shù)據(jù)的協(xié)議都是根據(jù)字節(jié)位數(shù)來的建瘫,寫入讀出數(shù)據(jù)解析時崭捍,使用NSString,NSData的16進制互轉(zhuǎn)方便解析提高代碼編寫速度啰脚。

代碼如下:
.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-----將十六進制數(shù)據(jù)轉(zhuǎn)換成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類型轉(zhuǎn)換成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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末殷蛇,一起剝皮案震驚了整個濱河市实夹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌粒梦,老刑警劉巖亮航,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異匀们,居然都是意外死亡缴淋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進店門泄朴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來重抖,“玉大人,你說我怎么就攤上這事祖灰≈优妫” “怎么了?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵局扶,是天一觀的道長恨统。 經(jīng)常有香客問我,道長三妈,這世上最難降的妖魔是什么畜埋? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮畴蒲,結(jié)果婚禮上悠鞍,老公的妹妹穿的比我還像新娘。我一直安慰自己模燥,他們只是感情好狞玛,可當我...
    茶點故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著涧窒,像睡著了一般心肪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纠吴,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天硬鞍,我揣著相機與錄音,去河邊找鬼戴已。 笑死固该,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的糖儡。 我是一名探鬼主播伐坏,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼握联!你這毒婦竟也來了桦沉?” 一聲冷哼從身側(cè)響起每瞒,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纯露,沒想到半個月后剿骨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡埠褪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年浓利,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钞速。...
    茶點故事閱讀 38,629評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡贷掖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出渴语,到底是詐尸還是另有隱情羽资,我是刑警寧澤,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布遵班,位于F島的核電站,受9級特大地震影響潮改,放射性物質(zhì)發(fā)生泄漏狭郑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一汇在、第九天 我趴在偏房一處隱蔽的房頂上張望翰萨。 院中可真熱鬧,春花似錦糕殉、人聲如沸亩鬼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雳锋。三九已至,卻和暖如春羡洁,著一層夾襖步出監(jiān)牢的瞬間玷过,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工筑煮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留辛蚊,地道東北人。 一個月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓真仲,卻偏偏與公主長得像袋马,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子秸应,可洞房花燭夜當晚...
    茶點故事閱讀 43,499評論 2 348

推薦閱讀更多精彩內(nèi)容