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; }
留下备用:
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入。如果用于字串数据,表示从字串中截取的字符数。