OC sha1+base64加密 以及 十进制转十六进制

java程序平移IOS中遇到加密问题。

java代码:

public static String getDigest( String algorithm, String data )
    {
		StringBuffer s = new StringBuffer();

		try{
			MessageDigest md = MessageDigest.getInstance( algorithm );
			byte[] dat = data.getBytes();
			md.update( dat );

			byte[] digest = md.digest();
			for( int i=0 ; i < digest.length ; i++ ){
				int d = digest[ i ];

				if( d < 0 ){		// byte 128-255
					d+= 256 ;
				}
				if( d < 16 ){		// 0-15 16
					s.append( "0" );
				}
				s.append( Integer.toString( d, 16 ) );
			}
		}
		catch( Exception e ){
		}

		return s.toString();
	}

java中的digest是有符号10进制的整数。需要注意的是,转成16进制是需要补位的,否则 遇到0A~0F会丢掉“0”。

OC中可以使用int8_t类型(有符号)或者uint8_t(无符号)代替。uint8_t是会自动补位补零的!

OC中 10进制转16进制的方法:

 [NSString stringWithFormat:@”%x” , 数字];  //%d 为10进制输出 %x 为16进制输出

OC代码:

+ (NSString *) sha1_base64:(NSString *) str {

    
    const char *cstr = [str cStringUsingEncoding:NSUTF8StringEncoding];
    
    NSData *data = [NSData dataWithBytes:cstr length:str.length];
    
    uint8_t digest[CC_SHA1_DIGEST_LENGTH];
//  int8_t digest[CC_SHA1_DIGEST_LENGTH];   //使用int8_t时,循环中需要做补零处理。
    
    CC_SHA1(data.bytes, data.length, digest);

    NSMutableString *output = [[NSMutableString alloc]init];
    
    for (int i=0; i<CC_SHA1_DIGEST_LENGTH; i++) {
        int d = digest[i];
        
        //补零处理
//        if (d < 0) {
//            d += 256;
//        }
//        if (d < 16) {
//            [outStr appendString:@"0"];
//        }
        
        NSString *tmpStr = [NSString stringWithFormat:@"%x" ,d];    //%d 为10进制输出   %x 为16进制输出
        
        [output appendString:tmpStr];
    }

    return output;
}

留下备用:

    d:以带符号的十进制整数形式输出整数(正数不输出符号)。 
    o:以无符号八进制整数形式输出整数(不输出前导符O)。 
    x:以无符号十六进制整数形式输出整数(不输出前导符Ox)。 
    u:以无符号十进制整数形式输出整数。 
    c:以字符形式输出,输出一个字符。 
    s:以字符串形式输出,输出字符串的字符至结尾符’\O’为止。 
    f:以小数形式输出实数,隐含输出1位整数,6位小数。 
    e:以标准指数形式输出实数,数字部分隐含1位整数,6位小数。 
    g:根据给定的值和精度,自动选择f与e中较紧凑的一种格式,不输出无意义的O。 
    一般数据默认的输出宽度等于数据的实际位数。例如: 
    int a一3,b一12;float x一1.23,y一4.785; 
    ①printf(“a=%d,b=%d”,a,b); 
    输出结果:a=3,b===12 
    ②printf(“%f*%f一%f”,x,y,x*y); 
    输出结果:1.230000*4.785000—5.885550     
    对输出格式,C语言同样提供附加格式字符,用以对输出格式作进一步描述。 
    l:用于长整型数据输出(%ld,%lo,%lx,%lu),以及双精度型数据输出(%lf,%le,%lg)。 
    m:域宽,十进制整数,用以描述输出数据所占宽度。如果m大于数据实际位数,输出时前面补足空格;如果m小于数据的实际位数,按实际位数输出。 
    n:附加域宽,十进制整数,用于指定实型数据小数部分的输出位数。如果n大于小数部分的实际位数,输出时小数部分用O补足;如果n小于小数部分的实际位数,输出时将小数部分多余的位4舍5入。如果用于字串数据,表示从字串中截取的字符数。

    原文作者:进制转换
    原文地址: https://blog.csdn.net/rockstonexx/article/details/8646664
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞