zoukankan      html  css  js  c++  java
  • 加密解密再也不是你的噩梦

    加密解密再也不是你的噩梦

    也许你在你的项目中用过加密解密,诸如AES加解密、DES加解密等等加密算法。你从Github上下载了一份源码,导入到自己的项目当中,导入头文件,使用,欧了。

    其实事情远没有你想得这么简单。你需要加密字符串对吧,你把字符串转换成了NSData,然后你需要提取出这个NSData中的字符信息(用来当做GET请求的参数)。这时候你就傻眼了。你发现,这个加密后的NSData已经无法转换成NSString了,那还用什么来当做GET请求的参数呢?

    今天,哥给大家提供一个用来将任意编码的二进制文件转换为文本,并能将这个文本反过来转换为二进制文件的category。

    直接提供源码:

    NSData+Binary.h 与 NSData+Binary.m

    //
    //  NSData+Binary.h
    //
    //  http://home.cnblogs.com/u/YouXianMing/
    //
    //  Copyright (c) 2014年 Y.X. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    
    @interface NSData (Binary)
    
    // 将不可识别二进制文件转换为可识别的文本文件
    - (NSString *)transformToVisibleString;
    
    @end
    //
    //  NSData+Binary.m
    //
    //  http://home.cnblogs.com/u/YouXianMing/
    //
    //  Copyright (c) 2014年 Y.X. All rights reserved.
    //
    
    
    #import "NSData+Binary.h"
    
    @implementation NSData (Binary)
    
    - (NSString *)transformToVisibleString
    {
        if (self)
        {
            NSString* strRet = @"";
            char* pBuff = (char*)[self bytes];
            
            for (int i=0; i<self.length; i++)
            {
                strRet = [strRet stringByAppendingFormat:@"%02X", pBuff[i] & 0xFF];
            }
            
            return strRet;
        }
        else
        {
            return nil;
        }
    }
    
    @end

    NSString+Binary.h 与 NSString+Binary.m

    //
    //  NSString+Binary.h
    //
    //  http://home.cnblogs.com/u/YouXianMing/
    //
    //  Copyright (c) 2014年 Y.X. All rights reserved.
    //
    
    
    #import <Foundation/Foundation.h>
    
    @interface NSString (Binary)
    
    // 将字符串转换成不可识别二进制文件
    - (NSData *)transformToBinaryData;
    
    @end
    //
    //  NSString+Binary.m
    //
    //  http://home.cnblogs.com/u/YouXianMing/
    //
    //  Copyright (c) 2014年 Y.X. All rights reserved.
    //
    
    #import "NSString+Binary.h"
    
    @implementation NSString (Binary)
    
    - (NSData *)transformToBinaryData
    {
        if (self)
        {
            // 将字符串转换成不可识别二进制文件
            static unsigned char _map_ch2hex[] =
            {
                0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
                0, 0, 0, 0, 0, 0, 0,    // :, ;, <, =, >, ?, @,
                0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
            };
            
            unsigned char* bytes = (unsigned char*)malloc((self.length + 1) * sizeof(unsigned char));
            [[self uppercaseString] getCString:(char*)bytes
                                     maxLength:self.length + 1
                                      encoding:NSUTF8StringEncoding];
            
            unsigned char *p1 = bytes, *p2 = bytes;
            unsigned long n   = self.length / 2;
            for (int i = 0; i<n; i++)
            {
                *p1 = _map_ch2hex[*p2-'0'] * 0x10 + _map_ch2hex[*(p2+1)-'0'];
                p1++;
                p2 += 2;
            }
            
            NSData* toData = [NSData dataWithBytes:bytes length:n];
            return toData;
        }
        else
        {
            return nil;
        }
    }
    
    @end

    以下两处是核心源码:

    注:

    为何不直接提供各种加密解密算法现成的源码呢?其实,本人只是提供给大家一个工具,用来将任意编码的二进制文件转换为文本,并能将这个文本反过来转换为二进制文件的category。面向对象设计中遵循单一职责原则,为了能模块化,让大家好封装而已。至于怎么去封装那些加密解密算法就是体力活了,本人提供的这个,就是你能用着舒服的很核心的部件之一。

     
  • 相关阅读:
    2018年7月28日杂记:迎来大三
    Spring第一课:基于XML装配bean(四),三种实例化方式:默认构造、静态工厂、实例工厂
    在Spring中使用静态工厂时发生的无法得到对象的问题
    队列的实现——java
    队列的实现——c++
    栈的实现——java
    栈的实现——c++
    双向链表的实现——java
    双向链表的实现——c++
    C++类模板 template <class T>
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/3953234.html
Copyright © 2011-2022 走看看