DDData.m.svn-base
上传用户:kc0325
上传日期:2020-06-20
资源大小:204k
文件大小:4k
源码类别:

iPhone

开发平台:

Objective-C

  1. #import "DDData.h"
  2. #if TARGET_OS_IPHONE
  3. #import <CommonCrypto/CommonDigest.h>
  4. #else
  5. #import "SSCrypto.h"
  6. #endif
  7. @implementation NSData (DDData)
  8. #if TARGET_OS_IPHONE
  9. static char encodingTable[64] = {
  10. 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
  11. 'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
  12. 'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
  13. 'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/' };
  14. #endif
  15. - (NSData *)md5Digest
  16. {
  17. #if TARGET_OS_IPHONE
  18. unsigned char result[CC_MD5_DIGEST_LENGTH];
  19.     
  20.     CC_MD5([self bytes], [self length], result);
  21.     return [NSData dataWithBytes:result length:CC_MD5_DIGEST_LENGTH];
  22. #else
  23. return [SSCrypto getMD5ForData:self];
  24. #endif
  25. }
  26. - (NSData *)sha1Digest
  27. {
  28. #if TARGET_OS_IPHONE
  29. unsigned char result[CC_SHA1_DIGEST_LENGTH];
  30.     
  31. CC_SHA1([self bytes], [self length], result);
  32.     return [NSData dataWithBytes:result length:CC_SHA1_DIGEST_LENGTH];
  33. #else
  34. return [SSCrypto getSHA1ForData:self];
  35. #endif
  36. }
  37. - (NSString *)hexStringValue
  38. {
  39. #if TARGET_OS_IPHONE
  40. NSMutableString *stringBuffer = [NSMutableString stringWithCapacity:([self length] * 2)];
  41.     const unsigned char *dataBuffer = [self bytes];
  42.     int i;
  43.     
  44.     for (i = 0; i < [self length]; ++i)
  45. {
  46.         [stringBuffer appendFormat:@"%02x", (unsigned long)dataBuffer[i]];
  47. }
  48.     
  49.     return [[stringBuffer copy] autorelease];
  50. #else
  51. return [self hexval];
  52. #endif
  53. }
  54. - (NSString *)base64Encoded
  55. {
  56. #if TARGET_OS_IPHONE
  57. const unsigned char *bytes = [self bytes];
  58. NSMutableString *result = [NSMutableString stringWithCapacity:[self length]];
  59. unsigned long ixtext = 0;
  60. unsigned long lentext = [self length];
  61. long ctremaining = 0;
  62. unsigned char inbuf[3], outbuf[4];
  63. unsigned short i = 0;
  64. unsigned short charsonline = 0, ctcopy = 0;
  65. unsigned long ix = 0;
  66. while( YES )
  67. {
  68. ctremaining = lentext - ixtext;
  69. if( ctremaining <= 0 ) break;
  70. for( i = 0; i < 3; i++ ) {
  71. ix = ixtext + i;
  72. if( ix < lentext ) inbuf[i] = bytes[ix];
  73. else inbuf [i] = 0;
  74. }
  75. outbuf [0] = (inbuf [0] & 0xFC) >> 2;
  76. outbuf [1] = ((inbuf [0] & 0x03) << 4) | ((inbuf [1] & 0xF0) >> 4);
  77. outbuf [2] = ((inbuf [1] & 0x0F) << 2) | ((inbuf [2] & 0xC0) >> 6);
  78. outbuf [3] = inbuf [2] & 0x3F;
  79. ctcopy = 4;
  80. switch( ctremaining )
  81. {
  82. case 1:
  83. ctcopy = 2;
  84. break;
  85. case 2:
  86. ctcopy = 3;
  87. break;
  88. }
  89. for( i = 0; i < ctcopy; i++ )
  90. [result appendFormat:@"%c", encodingTable[outbuf[i]]];
  91. for( i = ctcopy; i < 4; i++ )
  92. [result appendString:@"="];
  93. ixtext += 3;
  94. charsonline += 4;
  95. }
  96. return [NSString stringWithString:result];
  97. #else
  98. return [self encodeBase64WithNewlines:NO];
  99. #endif
  100. }
  101. - (NSData *)base64Decoded
  102. {
  103. #if TARGET_OS_IPHONE
  104. const unsigned char *bytes = [self bytes];
  105. NSMutableData *result = [NSMutableData dataWithCapacity:[self length]];
  106. unsigned long ixtext = 0;
  107. unsigned long lentext = [self length];
  108. unsigned char ch = 0;
  109. unsigned char inbuf[4], outbuf[3];
  110. short i = 0, ixinbuf = 0;
  111. BOOL flignore = NO;
  112. BOOL flendtext = NO;
  113. while( YES )
  114. {
  115. if( ixtext >= lentext ) break;
  116. ch = bytes[ixtext++];
  117. flignore = NO;
  118. if( ( ch >= 'A' ) && ( ch <= 'Z' ) ) ch = ch - 'A';
  119. else if( ( ch >= 'a' ) && ( ch <= 'z' ) ) ch = ch - 'a' + 26;
  120. else if( ( ch >= '0' ) && ( ch <= '9' ) ) ch = ch - '0' + 52;
  121. else if( ch == '+' ) ch = 62;
  122. else if( ch == '=' ) flendtext = YES;
  123. else if( ch == '/' ) ch = 63;
  124. else flignore = YES;
  125. if( ! flignore )
  126. {
  127. short ctcharsinbuf = 3;
  128. BOOL flbreak = NO;
  129. if( flendtext )
  130. {
  131. if( ! ixinbuf ) break;
  132. if( ( ixinbuf == 1 ) || ( ixinbuf == 2 ) ) ctcharsinbuf = 1;
  133. else ctcharsinbuf = 2;
  134. ixinbuf = 3;
  135. flbreak = YES;
  136. }
  137. inbuf [ixinbuf++] = ch;
  138. if( ixinbuf == 4 )
  139. {
  140. ixinbuf = 0;
  141. outbuf [0] = ( inbuf[0] << 2 ) | ( ( inbuf[1] & 0x30) >> 4 );
  142. outbuf [1] = ( ( inbuf[1] & 0x0F ) << 4 ) | ( ( inbuf[2] & 0x3C ) >> 2 );
  143. outbuf [2] = ( ( inbuf[2] & 0x03 ) << 6 ) | ( inbuf[3] & 0x3F );
  144. for( i = 0; i < ctcharsinbuf; i++ )
  145. [result appendBytes:&outbuf[i] length:1];
  146. }
  147. if( flbreak )  break;
  148. }
  149. }
  150. return [NSData dataWithData:result];
  151. #else
  152. return [self decodeBase64WithNewLines:NO];
  153. #endif
  154. }
  155. @end