iTools.m 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961
  1. //
  2. // iTools.m
  3. // VclustersGemini
  4. //
  5. // Created by 余衡武 on 2020/4/1.
  6. // Copyright © 2020 APPLE. All rights reserved.
  7. //
  8. #import "iTools.h"
  9. #import "CommonCrypto/CommonDigest.h"
  10. #import <CommonCrypto/CommonCrypto.h>
  11. #import "RSA.h"
  12. static const char encodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  13. /* 运营商 首先需要引入以下两个系统类:*/
  14. #import <CoreTelephony/CTCarrier.h>
  15. #import <CoreTelephony/CTTelephonyNetworkInfo.h>
  16. @implementation iTools
  17. + (NSString *)getJSONStringFromDictionary:(NSDictionary *)dict {
  18. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil];
  19. NSString *jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  20. return jsonStr;
  21. }
  22. + (NSString *)getJSONStringFromArray:(NSArray *)array {
  23. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:array options:NSJSONWritingPrettyPrinted error:nil];
  24. NSString *jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  25. return jsonStr;
  26. }
  27. + (NSInteger)getNowTimeStamp {
  28. return [[NSDate date] timeIntervalSince1970];
  29. }
  30. + (NSInteger)getNowTimeStampSS {
  31. NSDate *dateValue = [NSDate date];
  32. NSTimeInterval second = [dateValue timeIntervalSince1970];
  33. long long dTime = [[NSNumber numberWithDouble:second*1000] longLongValue];
  34. return dTime;
  35. }
  36. /** 获取当前时间戳-以秒为单位-return yyyyy年MM月dd日 HH:mm:ss */
  37. + (NSString *)getNowTimeString1 {
  38. NSDate *nowDate = [NSDate date];
  39. NSDateFormatter *format = [[NSDateFormatter alloc] init];
  40. [format setDateFormat:@"yyyy年MM月dd日 HH:mm:ss"];
  41. NSString *dateStr = [format stringFromDate:nowDate];
  42. return dateStr;
  43. }
  44. /** 获取当前时间戳-以秒为单位-return yyyyy-MM-dd HH:mm:ss */
  45. + (NSString *)getNowTimeString2 {
  46. NSDate *nowDate = [NSDate date];
  47. NSDateFormatter *format = [[NSDateFormatter alloc] init];
  48. [format setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
  49. NSString *dateStr = [format stringFromDate:nowDate];
  50. return dateStr;
  51. }
  52. + (NSInteger)getNowTimeStampToInterval:(NSTimeInterval)second {
  53. long long dTime = [[NSNumber numberWithDouble:second*1000] longLongValue];
  54. return dTime;
  55. }
  56. + (NSString *)getNowTimeStampString {
  57. NSString* date;
  58. NSDateFormatter * formatter = [[NSDateFormatter alloc ] init];
  59. [formatter setDateFormat:@"YYYYMMddhhmmssSSS"];
  60. date = [formatter stringFromDate:[NSDate date]];
  61. NSString *timeNow = [NSString stringWithFormat:@"%@", date];
  62. return timeNow;
  63. }
  64. + (NSString *)getNowTimeString {
  65. NSDate *nowDate = [NSDate date];
  66. NSDateFormatter *format = [[NSDateFormatter alloc] init];
  67. [format setDateFormat:@"yyyy/MM/dd HH:mm"];
  68. NSString *dateStr = [format stringFromDate:nowDate];
  69. return dateStr;
  70. }
  71. + (NSString *)getNowDateString {
  72. NSDate *nowDate = [NSDate date];
  73. NSDateFormatter *format = [[NSDateFormatter alloc] init];
  74. [format setDateFormat:@"yyyy-MM-dd"];
  75. NSString *dateStr = [format stringFromDate:nowDate];
  76. return dateStr;
  77. }
  78. + (NSString *)getTimeStringFromTimeInterval:(NSInteger)timeInterval {
  79. NSDate *date = [[NSDate alloc]initWithTimeIntervalSince1970:timeInterval];
  80. NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
  81. [formatter setDateFormat:@"yyyy/MM/dd HH:mm"];
  82. NSString *timeString = [formatter stringFromDate:date];
  83. return timeString;
  84. }
  85. + (NSDate *)getTimeStringToDate:(NSString *)timeStr{
  86. NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
  87. //需要设置为和字符串相同的格式
  88. [dateFormatter setDateFormat:@"YYYYMMddhhmmssSSS"];
  89. NSDate *localDate = [dateFormatter dateFromString:timeStr];
  90. return localDate;
  91. }
  92. + (NSString *)getPlayTimeStringFromTimeInterval:(NSTimeInterval)timeInterval {
  93. NSInteger seconds = timeInterval;
  94. //format of hour
  95. NSString *str_hour = [NSString stringWithFormat:@"%02ld",seconds/3600];
  96. //format of minut
  97. NSString *str_minute = [NSString stringWithFormat:@"%02ld",(seconds%3600)/60];
  98. //format of second
  99. NSString *str_second = [NSString stringWithFormat:@"%02ld",seconds%60];
  100. //format of time
  101. NSString *format_time = [NSString stringWithFormat:@"%@:%@:%@",str_hour,str_minute,str_second];
  102. return format_time;
  103. }
  104. //ypp add 通讯录文件名格式YmdHis+随机数字(1000~9999) 2020 07 07 15 08 25 1000
  105. + (NSString *)getContactsNameStr {
  106. NSString* date;
  107. NSDateFormatter * formatter = [[NSDateFormatter alloc ] init];
  108. [formatter setDateFormat:@"YYYYMMddhhmmss"];
  109. date = [formatter stringFromDate:[NSDate date]];
  110. int randomNumber = (int) arc4random_uniform(9999) + 1000;
  111. NSString *contactsNameStr = [NSString stringWithFormat:@"%@%d",date,randomNumber];
  112. return contactsNameStr;
  113. }
  114. + (UIImage*)createImageWithColor:(UIColor *)color
  115. {
  116. CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
  117. UIGraphicsBeginImageContext(rect.size);
  118. CGContextRef context = UIGraphicsGetCurrentContext();
  119. CGContextSetFillColorWithColor(context, [color CGColor]);
  120. CGContextFillRect(context, rect);
  121. UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
  122. UIGraphicsEndImageContext();
  123. return image;
  124. }
  125. + (UIImage *)imageFromColor:(UIColor *)color view:(UIView *)view {
  126. CGRect rect = CGRectMake(0, 0, view.frame.size.width, view.frame.size.height);
  127. UIGraphicsBeginImageContext(rect.size);
  128. CGContextRef context = UIGraphicsGetCurrentContext();
  129. CGContextSetFillColorWithColor(context, [color CGColor]);
  130. CGContextFillRect(context, rect);
  131. UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
  132. UIGraphicsEndImageContext();
  133. return img;
  134. }
  135. + (UIImage *)getImageFromColor:(UIColor *)color rect:(CGRect)rect {
  136. UIGraphicsBeginImageContext(rect.size);
  137. CGContextRef context = UIGraphicsGetCurrentContext();
  138. CGContextSetFillColorWithColor(context, [color CGColor]);
  139. CGContextFillRect(context, rect);
  140. UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
  141. UIGraphicsEndImageContext();
  142. return img;
  143. }
  144. /**将UIColor变换为UIImage,设置尺寸**/
  145. + (UIImage *)createImageWithColor:(UIColor *)color withSize:(CGSize)size {
  146. CGRect rect = CGRectMake(0.0f, 0.0f, size.width, size.height);
  147. UIGraphicsBeginImageContextWithOptions(rect.size,NO,[UIScreen mainScreen].scale);
  148. CGContextRef context = UIGraphicsGetCurrentContext();
  149. CGContextSetFillColorWithColor(context, [color CGColor]);
  150. CGContextFillRect(context, rect);
  151. UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
  152. UIGraphicsEndImageContext();
  153. return theImage;
  154. }
  155. /**将文件大小B 自动转成对应的B KB MB GB**/
  156. + (NSString *)getFileSizeStringFormedValue:(NSInteger)value
  157. {
  158. double convertedValue = value*1.0;
  159. int multiplyFactor = 0;
  160. NSArray *tokens = [NSArray arrayWithObjects:@"B",@"KB",@"MB",@"GB",@"TB",nil];
  161. while (convertedValue > 1024 && multiplyFactor < tokens.count) {
  162. convertedValue /= 1024;
  163. multiplyFactor++;
  164. }
  165. NSString *text = [NSString stringWithFormat:@"%4.2f%@",convertedValue, [tokens objectAtIndex:multiplyFactor]];
  166. if ([text isEqualToString:@"0.00B"]) {
  167. text = @"0B";
  168. }
  169. return text;
  170. }
  171. +(BOOL)getBoolWithKey:(NSString*)key{
  172. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  173. return [defaults boolForKey:key];
  174. }
  175. +(void)setBoolWithKey:(NSString*)key value:(BOOL)value{
  176. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  177. [defaults setBool:value forKey:key];
  178. [defaults synchronize];
  179. }
  180. +(NSString*)getStringWithKey:(NSString*)key{
  181. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  182. return [defaults stringForKey:key];
  183. }
  184. +(void)setStringWithKey:(NSString*)key value:(NSString*)value{
  185. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  186. [defaults setObject:value forKey:key];
  187. [defaults synchronize];
  188. }
  189. +(NSInteger)getIntegerWithKey:(NSString*)key{
  190. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  191. return [defaults integerForKey:key];
  192. }
  193. +(void)setIntegerWithKey:(NSString*)key value:(NSInteger)value{
  194. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  195. [defaults setInteger:value forKey:key];
  196. [defaults synchronize];
  197. }
  198. + (NSString *)notRounding:(float)price afterPoint:(int)position {
  199. NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundDown scale:position raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO];
  200. NSDecimalNumber *ouncesDecimal = [[NSDecimalNumber alloc] initWithFloat:price];
  201. NSDecimalNumber *roundedOunces = [ouncesDecimal decimalNumberByRoundingAccordingToBehavior:roundingBehavior];
  202. return [NSString stringWithFormat:@"%@%%",roundedOunces];
  203. }
  204. + (CGFloat)notRoundingFloat:(float)price afterPoint:(int)position {
  205. NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundDown scale:position raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO];
  206. NSDecimalNumber *ouncesDecimal = [[NSDecimalNumber alloc] initWithFloat:price];
  207. NSDecimalNumber *roundedOunces = [ouncesDecimal decimalNumberByRoundingAccordingToBehavior:roundingBehavior];
  208. return [roundedOunces floatValue];
  209. }
  210. + (NSString *)formatFloat:(float)f
  211. {
  212. if (fmodf(f, 1)==0) {//如果有一位小数点
  213. return [NSString stringWithFormat:@"%.0f",f];
  214. } else if (fmodf(f*10, 1)==0) {//如果有两位小数点
  215. return [NSString stringWithFormat:@"%.1f",f];
  216. } else {
  217. return [NSString stringWithFormat:@"%.2f",f];
  218. }
  219. }
  220. /**
  221. 获取运营商名称
  222. */
  223. + (NSString *)getCarrierInfo
  224. {
  225. CTTelephonyNetworkInfo *telephonyInfo = [[CTTelephonyNetworkInfo alloc] init];
  226. CTCarrier *carrier = nil;
  227. if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 12.1) {
  228. if ([telephonyInfo respondsToSelector:@selector(serviceSubscriberCellularProviders)]) {
  229. #pragma clang diagnostic push
  230. #pragma clang diagnostic ignored "-Wunguarded-availability-new"
  231. NSDictionary *dic = [telephonyInfo serviceSubscriberCellularProviders];
  232. if (dic.allKeys.count) {
  233. carrier = [dic objectForKey:dic.allKeys[0]];
  234. }
  235. #pragma clang diagnostic pop
  236. }
  237. }
  238. if(!carrier) {
  239. //遇到的 warning 又明知干不掉的时候就用这种方法隐藏即可,-Wdeprecated-declarations
  240. #pragma clang diagnostic push
  241. #pragma clang diagnostic ignored "-Wdeprecated-declarations"
  242. carrier = telephonyInfo.subscriberCellularProvider;
  243. #pragma clang diagnostic pop
  244. }
  245. //countryCode,移动国家码,MCC的资源由国际电联(ITU)统一分配和管理,唯一识别移动用户所属的国家,共3位,中国为460;
  246. NSString *countryCode = [carrier mobileCountryCode];
  247. //code,移动网络码,共2位,中国移动TD系统使用00,中国联通GSM系统使用01,中国移动GSM系统使用02,中国电信CDMA系统使用03,一个典型的IMSI号码为460030912121001
  248. NSString *code = [carrier mobileNetworkCode];
  249. //网络运营商的名字
  250. NSString *carrier_name = @"";
  251. //用户运营商网络 (中国电信:CHINANET,中国联通:UNICOM,中国移动:CMNET,中国铁通:CRTC,中国广电:GCABLENET)
  252. if ([countryCode isEqualToString:@"460"] && countryCode && code) {
  253. if ([code isEqualToString:@"00"] || [code isEqualToString:@"02"] || [code isEqualToString:@"04"] || [code isEqualToString:@"07"] || [code isEqualToString:@"08"]|| [code isEqualToString:@"13"]) {
  254. carrier_name = @"CMNET";
  255. }
  256. else if ([code isEqualToString:@"03"] || [code isEqualToString:@"05"] || [code isEqualToString:@"11"] || [code isEqualToString:@"12"])
  257. {
  258. carrier_name = @"CHINANET";
  259. }
  260. else if ([code isEqualToString:@"01"] || [code isEqualToString:@"06"] || [code isEqualToString:@"09"] || [code isEqualToString:@"10"])
  261. {
  262. carrier_name = @"UNICOM";
  263. }
  264. else if ([code isEqualToString:@"20"])
  265. {
  266. carrier_name = @"CRTC";
  267. }
  268. else if ([code isEqualToString:@"15"])
  269. {
  270. carrier_name = @"GCABLENET";
  271. }
  272. }
  273. return carrier_name;
  274. }
  275. // 去除字符串中所有的空格和换行符(包括中间和首尾)
  276. + (NSString *)removeSpaceAndNewline:(NSString *)str
  277. {
  278. NSString *temp = [str stringByReplacingOccurrencesOfString:@" " withString:@""];
  279. temp = [temp stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; //去除掉首尾的空白字符和换行字符
  280. temp = [temp stringByReplacingOccurrencesOfString:@"\r" withString:@""];
  281. temp = [temp stringByReplacingOccurrencesOfString:@"\n" withString:@""];
  282. return temp;
  283. }
  284. #pragma mark 加密/解密(AES RSA base64 md5)
  285. // AES加密
  286. + (NSString *)AES128Encrypt:(NSString *)plainText key:(NSString *)key
  287. {
  288. char keyPtr[kCCKeySizeAES128+1];
  289. memset(keyPtr, 0, sizeof(keyPtr));
  290. [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
  291. NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
  292. NSUInteger dataLength = [data length];
  293. size_t bufferSize = dataLength + kCCBlockSizeAES128;
  294. void *buffer = malloc(bufferSize);
  295. size_t numBytesEncrypted = 0;
  296. CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
  297. kCCAlgorithmAES128,
  298. kCCOptionPKCS7Padding|kCCOptionECBMode,
  299. keyPtr,
  300. kCCBlockSizeAES128,
  301. NULL,
  302. [data bytes],
  303. dataLength,
  304. buffer,
  305. bufferSize,
  306. &numBytesEncrypted);
  307. if (cryptStatus == kCCSuccess) {
  308. NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
  309. return [resultData base64EncodedStringWithOptions:(NSDataBase64Encoding64CharacterLineLength)];
  310. }
  311. free(buffer);
  312. return nil;
  313. }
  314. //AES解密
  315. + (NSString *)AES128Decrypt:(NSString *)encryptText key:(NSString *)key
  316. {
  317. char keyPtr[kCCKeySizeAES128 + 1];
  318. memset(keyPtr, 0, sizeof(keyPtr));
  319. [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
  320. NSData *data = [[NSData alloc] initWithBase64EncodedString:encryptText options:NSDataBase64DecodingIgnoreUnknownCharacters];//base64解码
  321. NSUInteger dataLength = [data length];
  322. size_t bufferSize = dataLength + kCCBlockSizeAES128;
  323. void *buffer = malloc(bufferSize);
  324. size_t numBytesCrypted = 0;
  325. CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
  326. kCCAlgorithmAES128,
  327. kCCOptionPKCS7Padding|kCCOptionECBMode,
  328. keyPtr,
  329. kCCBlockSizeAES128,
  330. NULL,
  331. [data bytes],
  332. dataLength,
  333. buffer,
  334. bufferSize,
  335. &numBytesCrypted);
  336. if (cryptStatus == kCCSuccess) {
  337. NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
  338. return [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding];
  339. }
  340. free(buffer);
  341. return nil;
  342. }
  343. /**RSA加密-publicKey-公钥*/
  344. + (NSString *)RSAEncrypt:(NSString *)plainText key:(NSString *)publicKey {
  345. NSString *encrypted = [RSA encryptString:plainText publicKey:publicKey];
  346. return encrypted;
  347. }
  348. /**RSA解密-privateKey-私钥*/
  349. + (NSString *)RSADecrypt:(NSString *)encryptText key:(NSString *)privateKey {
  350. NSString *decrypted = [RSA decryptString:encryptText privateKey:privateKey];
  351. return decrypted;
  352. }
  353. /**Base64加密*/
  354. + (NSString *)Base64Encrypt:(NSString *)plainText {
  355. NSData *data = [plainText dataUsingEncoding:NSUTF8StringEncoding];
  356. return [data base64EncodedStringWithOptions:0];
  357. }
  358. /**base64解密*/
  359. + (NSString *)Base64Decrypt:(NSString *)encryptText {
  360. NSData *data = [self dataWithBase64EncodedString:encryptText];
  361. return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  362. }
  363. /**base64格式字符串转换为文本数据*/
  364. + (NSData *)dataWithBase64EncodedString:(NSString *)string
  365. {
  366. if (string == nil)
  367. [NSException raise:NSInvalidArgumentException format:@""];
  368. if ([string length] == 0)
  369. return [NSData data];
  370. static char *decodingTable = NULL;
  371. if (decodingTable == NULL)
  372. {
  373. decodingTable = malloc(256);
  374. if (decodingTable == NULL)
  375. return nil;
  376. memset(decodingTable, CHAR_MAX, 256);
  377. NSUInteger i;
  378. for (i = 0; i < 64; i++)
  379. decodingTable[(short)encodingTable[i]] = i;
  380. }
  381. const char *characters = [string cStringUsingEncoding:NSASCIIStringEncoding];
  382. if (characters == NULL) // Not an ASCII string!
  383. return nil;
  384. char *bytes = malloc((([string length] + 3) / 4) * 3);
  385. if (bytes == NULL)
  386. return nil;
  387. NSUInteger length = 0;
  388. NSUInteger i = 0;
  389. while (YES)
  390. {
  391. char buffer[4];
  392. short bufferLength;
  393. for (bufferLength = 0; bufferLength < 4; i++)
  394. {
  395. if (characters[i] == '\0')
  396. break;
  397. if (isspace(characters[i]) || characters[i] == '=')
  398. continue;
  399. buffer[bufferLength] = decodingTable[(short)characters[i]];
  400. if (buffer[bufferLength++] == CHAR_MAX) // Illegal character!
  401. {
  402. free(bytes);
  403. return nil;
  404. }
  405. }
  406. if (bufferLength == 0)
  407. break;
  408. if (bufferLength == 1) // At least two characters are needed to produce one byte!
  409. {
  410. free(bytes);
  411. return nil;
  412. }
  413. // Decode the characters in the buffer to bytes.
  414. bytes[length++] = (buffer[0] << 2) | (buffer[1] >> 4);
  415. if (bufferLength > 2)
  416. bytes[length++] = (buffer[1] << 4) | (buffer[2] >> 2);
  417. if (bufferLength > 3)
  418. bytes[length++] = (buffer[2] << 6) | buffer[3];
  419. }
  420. bytes = realloc(bytes, length);
  421. return [NSData dataWithBytesNoCopy:bytes length:length];
  422. }
  423. /**md5加密*/
  424. + (NSString *)md5Encrypt:(NSString *)encryptText{
  425. const char *cStr = [encryptText UTF8String];
  426. unsigned char result[CC_MD5_DIGEST_LENGTH];
  427. CC_MD5(cStr, strlen(cStr), result);
  428. return [[NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
  429. result[0], result[1], result[2], result[3],
  430. result[4], result[5], result[6], result[7],
  431. result[8], result[9], result[10], result[11],
  432. result[12], result[13], result[14], result[15]
  433. ] lowercaseString];
  434. }
  435. #pragma mark - RSA加密demo
  436. - (void)RSA {
  437. NSString *pubkey = @"-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI2bvVLVYrb4B0raZgFP60VXY\ncvRmk9q56QiTmEm9HXlSPq1zyhyPQHGti5FokYJMzNcKm0bwL1q6ioJuD4EFI56D\na+70XdRz1CjQPQE3yXrXXVvOsmq9LsdxTFWsVBTehdCmrapKZVVx6PKl7myh0cfX\nQmyveT/eqyZK1gYjvQIDAQAB\n-----END PUBLIC KEY-----";
  438. NSString *privkey = @"-----BEGIN PRIVATE KEY-----\nMIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMMjZu9UtVitvgHS\ntpmAU/rRVdhy9GaT2rnpCJOYSb0deVI+rXPKHI9Aca2LkWiRgkzM1wqbRvAvWrqK\ngm4PgQUjnoNr7vRd1HPUKNA9ATfJetddW86yar0ux3FMVaxUFN6F0KatqkplVXHo\n8qXubKHRx9dCbK95P96rJkrWBiO9AgMBAAECgYBO1UKEdYg9pxMX0XSLVtiWf3Na\n2jX6Ksk2Sfp5BhDkIcAdhcy09nXLOZGzNqsrv30QYcCOPGTQK5FPwx0mMYVBRAdo\nOLYp7NzxW/File//169O3ZFpkZ7MF0I2oQcNGTpMCUpaY6xMmxqN22INgi8SHp3w\nVU+2bRMLDXEc/MOmAQJBAP+Sv6JdkrY+7WGuQN5O5PjsB15lOGcr4vcfz4vAQ/uy\nEGYZh6IO2Eu0lW6sw2x6uRg0c6hMiFEJcO89qlH/B10CQQDDdtGrzXWVG457vA27\nkpduDpM6BQWTX6wYV9zRlcYYMFHwAQkE0BTvIYde2il6DKGyzokgI6zQyhgtRJ1x\nL6fhAkB9NvvW4/uWeLw7CHHVuVersZBmqjb5LWJU62v3L2rfbT1lmIqAVr+YT9CK\n2fAhPPtkpYYo5d4/vd1sCY1iAQ4tAkEAm2yPrJzjMn2G/ry57rzRzKGqUChOFrGs\nlm7HF6CQtAs4HC+2jC0peDyg97th37rLmPLB9txnPl50ewpkZuwOAQJBAM/eJnFw\nF5QAcL4CYDbfBKocx82VX/pFXng50T7FODiWbbL4UnxICE0UBFInNNiWJxNEb6jL\n5xd0pcy9O2DOeso=\n-----END PRIVATE KEY-----";
  439. NSString *encrypted = [RSA encryptString:@"hello world!" publicKey:pubkey];
  440. HLog(@"encrypted: %@", encrypted);
  441. NSString *decrypted = [RSA decryptString:encrypted privateKey:privkey];
  442. HLog(@"decrypted: %@", decrypted);
  443. }
  444. //防止N秒内,同部同接口频繁调用的处理
  445. + (BOOL)timeOverTosecode:(NSInteger)index bannerOldTime:(NSString *)bannerOldTime;
  446. {
  447. BOOL reFreshDevice_flag = YES;
  448. NSString *nowTime = [iTools getNowTimeStampString];
  449. NSString *oldTime = nil;
  450. if (![bannerOldTime isEqual:@""]) {
  451. oldTime = bannerOldTime;
  452. }
  453. //比较
  454. if ([oldTime length] > 0) {
  455. //时间差
  456. NSDate *dateNow = [iTools getTimeStringToDate:nowTime];
  457. NSDate *dateOld = [iTools getTimeStringToDate:oldTime];
  458. NSTimeInterval distanceBetweenDates = [dateNow timeIntervalSinceDate:dateOld];
  459. long long min = [[NSNumber numberWithDouble:distanceBetweenDates] longLongValue];
  460. if (min < index)
  461. {
  462. reFreshDevice_flag = NO;
  463. }else{
  464. reFreshDevice_flag = YES;
  465. }
  466. }
  467. return reFreshDevice_flag;
  468. }
  469. //获取拼音首字母(传入汉字字符串, 返回大写拼音首字母)
  470. + (NSString *)FirstCharactor:(NSString *)pString
  471. {
  472. //转成了可变字符串
  473. NSMutableString *pStr = [NSMutableString stringWithString:pString];
  474. //先转换为带声调的拼音
  475. CFStringTransform((CFMutableStringRef)pStr,NULL, kCFStringTransformMandarinLatin,NO);
  476. //再转换为不带声调的拼音
  477. CFStringTransform((CFMutableStringRef)pStr,NULL, kCFStringTransformStripDiacritics,NO);
  478. //转化为大写拼音
  479. NSString *pPinYin = [pStr capitalizedString];
  480. //获取并返回首字母
  481. return [pPinYin substringToIndex:1];
  482. }
  483. //根据uiview得到图像
  484. + (UIImage *)getImageFromView:(UIView *)fromView useScreenScale:(BOOL)use useNewMethod:(BOOL)useNewMethod
  485. {
  486. UIImage *viewImage = nil;
  487. if (([[[UIDevice currentDevice] systemVersion] doubleValue] > 7) && useNewMethod) {
  488. UIGraphicsBeginImageContextWithOptions(fromView.bounds.size, NO, [[UIScreen mainScreen] scale]);
  489. [fromView drawViewHierarchyInRect:fromView.bounds afterScreenUpdates:NO];
  490. viewImage = UIGraphicsGetImageFromCurrentImageContext();
  491. UIGraphicsEndImageContext();
  492. } else {
  493. NSInteger scale = use ? [[UIScreen mainScreen] scale] : 1;
  494. UIGraphicsBeginImageContextWithOptions(CGSizeMake(fromView.bounds.size.width, fromView.bounds.size.height), NO, scale);
  495. [fromView.layer renderInContext:UIGraphicsGetCurrentContext()];
  496. viewImage = UIGraphicsGetImageFromCurrentImageContext();
  497. UIGraphicsEndImageContext();
  498. }
  499. return viewImage;
  500. }
  501. //验证身份证
  502. //必须满足以下规则
  503. //1. 长度必须是18位,前17位必须是数字,第十八位可以是数字或X
  504. //2. 前两位必须是以下情形中的一种:11,12,13,14,15,21,22,23,31,32,33,34,35,36,37,41,42,43,44,45,46,50,51,52,53,54,61,62,63,64,65,71,81,82,91
  505. //3. 第7到第14位出生年月日。第7到第10位为出生年份;11到12位表示月份,范围为01-12;13到14位为合法的日期
  506. //4. 第17位表示性别,双数表示女,单数表示男
  507. //5. 第18位为前17位的校验位
  508. //算法如下:
  509. //(1)校验和 = (n1 + n11) * 7 + (n2 + n12) * 9 + (n3 + n13) * 10 + (n4 + n14) * 5 + (n5 + n15) * 8 + (n6 + n16) * 4 + (n7 + n17) * 2 + n8 + n9 * 6 + n10 * 3,其中n数值,表示第几位的数字
  510. //(2)余数 = 校验和 % 11
  511. //(3)如果余数为0,校验位应为1,余数为1到10校验位应为字符串“0X98765432”(不包括分号)的第余数位的值(比如余数等于3,校验位应为9)
  512. //6. 出生年份的前两位必须是19或20
  513. + (BOOL)verifyIDCardNumber:(NSString *)value
  514. {
  515. value = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
  516. if ([value length] != 18) {
  517. return NO;
  518. }
  519. NSString *mmdd = @"(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8])))";
  520. NSString *leapMmdd = @"0229";
  521. NSString *year = @"(19|20)[0-9]{2}";
  522. NSString *leapYear = @"(19|20)(0[48]|[2468][048]|[13579][26])";
  523. NSString *yearMmdd = [NSString stringWithFormat:@"%@%@", year, mmdd];
  524. NSString *leapyearMmdd = [NSString stringWithFormat:@"%@%@", leapYear, leapMmdd];
  525. NSString *yyyyMmdd = [NSString stringWithFormat:@"((%@)|(%@)|(%@))", yearMmdd, leapyearMmdd, @"20000229"];
  526. NSString *area = @"(1[1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]|6[1-5]|82|[7-9]1)[0-9]{4}";
  527. NSString *regex = [NSString stringWithFormat:@"%@%@%@", area, yyyyMmdd , @"[0-9]{3}[0-9Xx]"];
  528. NSPredicate *regexTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
  529. if (![regexTest evaluateWithObject:value]) {
  530. return NO;
  531. }
  532. int summary = ([value substringWithRange:NSMakeRange(0,1)].intValue + [value substringWithRange:NSMakeRange(10,1)].intValue) *7
  533. + ([value substringWithRange:NSMakeRange(1,1)].intValue + [value substringWithRange:NSMakeRange(11,1)].intValue) *9
  534. + ([value substringWithRange:NSMakeRange(2,1)].intValue + [value substringWithRange:NSMakeRange(12,1)].intValue) *10
  535. + ([value substringWithRange:NSMakeRange(3,1)].intValue + [value substringWithRange:NSMakeRange(13,1)].intValue) *5
  536. + ([value substringWithRange:NSMakeRange(4,1)].intValue + [value substringWithRange:NSMakeRange(14,1)].intValue) *8
  537. + ([value substringWithRange:NSMakeRange(5,1)].intValue + [value substringWithRange:NSMakeRange(15,1)].intValue) *4
  538. + ([value substringWithRange:NSMakeRange(6,1)].intValue + [value substringWithRange:NSMakeRange(16,1)].intValue) *2
  539. + [value substringWithRange:NSMakeRange(7,1)].intValue *1 + [value substringWithRange:NSMakeRange(8,1)].intValue *6
  540. + [value substringWithRange:NSMakeRange(9,1)].intValue *3;
  541. NSInteger remainder = summary % 11;
  542. NSString *checkBit = @"";
  543. NSString *checkString = @"10X98765432";
  544. checkBit = [checkString substringWithRange:NSMakeRange(remainder,1)];// 判断校验位
  545. return [checkBit isEqualToString:[[value substringWithRange:NSMakeRange(17,1)] uppercaseString]];
  546. }
  547. #pragma mark --------------------
  548. #pragma mark - Localizable
  549. /**< 得到当前系统的语言 */
  550. + (NSString *)getCurrentLocalizableLanguage {
  551. NSArray *languages = [NSLocale preferredLanguages];
  552. NSString *currentLanguage = [languages objectAtIndex:0];
  553. return currentLanguage;
  554. }
  555. /**< 得到当前语言是否为中文 */
  556. + (BOOL)isChineseLanguage {
  557. NSString *currentLanguage = [self getCurrentLocalizableLanguage];
  558. if ([currentLanguage rangeOfString:@"^zh-" options:NSRegularExpressionSearch range:NSMakeRange(0, currentLanguage.length)].location != NSNotFound) {
  559. return YES;
  560. }
  561. return NO;
  562. }
  563. #define FileHashDefaultChunkSizeForReadingData 1024*8
  564. + (NSString*)getFileMD5WithPath:(NSString*)path {
  565. NSFileManager *fileManager = [NSFileManager defaultManager];
  566. if([fileManager fileExistsAtPath:path isDirectory:nil])
  567. {
  568. NSData *data = [NSData dataWithContentsOfFile:path];
  569. unsigned char digest[CC_MD5_DIGEST_LENGTH];
  570. CC_MD5( data.bytes, (CC_LONG)data.length, digest );
  571. NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
  572. for( int i = 0; i < CC_MD5_DIGEST_LENGTH; i++ )
  573. {
  574. [output appendFormat:@"%02x", digest[i]];
  575. }
  576. return output;
  577. }
  578. else
  579. {
  580. return @"";
  581. }
  582. }
  583. + (CAShapeLayer *)getCornerRoundWithSelfView:(UIView *)originalView byRoundingCorners:(UIRectCorner)corners cornerRect:(CGRect)rect {
  584. UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:rect byRoundingCorners:corners cornerRadii:CGSizeMake(10, 10)];
  585. CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
  586. maskLayer.frame = originalView.bounds;
  587. maskLayer.path = maskPath.CGPath;
  588. return maskLayer;
  589. }
  590. // 彩色图变黑白图
  591. + (UIImage*)getGrayImageFromImage:(UIImage*)sourceImage {
  592. int width = sourceImage.size.width-2;
  593. int height = sourceImage.size.height;
  594. CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
  595. CGContextRef context = CGBitmapContextCreate (nil, width, height,8,0, colorSpace,kCGImageAlphaNone);
  596. CGColorSpaceRelease(colorSpace);
  597. if (context ==NULL) {
  598. return nil;
  599. }
  600. CGContextDrawImage(context,CGRectMake(0,0, width, height), sourceImage.CGImage);
  601. UIImage *grayImage = [UIImage imageWithCGImage:CGBitmapContextCreateImage(context)];
  602. CGContextRelease(context);
  603. return grayImage;
  604. }
  605. // 显示base64二进制图片
  606. + (void)setImageView:(UIImageView *)imageView WithBase64String:(NSString *)avatar {
  607. //参数在这里 + (void) setImageView:(UIImageView *)imageView WithString:(NSString *)avatar
  608. //二进制显示
  609. /*服务器返回:例如
  610. data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAAABnRSTlMAAAAAAABupgeRAAAAhElEQVRYhe3Y0QmAIBhF4YwGaZRGaNRGaJRGaYEyTj/RfTjnVYQPBRXbuh9DXuPfgOtkkWSRZJFkkUJZU3H+tsx3Q5VrLXS1ZJFkkWSRZJFkkWSRZJFkkUJZLfPH5vktX3mtv54buomySLJIskihrNBTvvWHP0V37oDQTZRFkkWSRQplnQDfEjVVBe3tAAAAAElFTkSuQmCC
  611. *上面的字符串复制到浏览器是可以显示出来一个图片的,这里说一下,字符串前面的data:image/png;base64是这个图片的格式,
  612. * web上面 解析好像是需要这部分的,但是拿到我们的iOS平台上,是不需要这部分的,有这部分反而解析不出来图片。
  613. * 所以这里可以说这部分属于格式部分,so我们显示的时候不要这部分。
  614. */
  615. NSArray *imageArray = [avatar componentsSeparatedByString:@","];
  616. NSData *imageData = [[NSData alloc] initWithBase64EncodedString:imageArray[1] options:NSDataBase64DecodingIgnoreUnknownCharacters];
  617. UIImage *image = [UIImage imageWithData:imageData];
  618. imageView.image = [iTools cutAlphaZero:image];
  619. }
  620. // iOS裁剪掉图片周围透明度为0的部分
  621. + (UIImage *)cutAlphaZero:(UIImage *)image {
  622. CGImageRef cgimage = [image CGImage];
  623. size_t width = CGImageGetWidth(cgimage); // 图片宽度
  624. size_t height = CGImageGetHeight(cgimage); // 图片高度
  625. unsigned char *data = calloc(width * height * 4, sizeof(unsigned char)); // 取图片首地址
  626. size_t bitsPerComponent = 8; // r g b a 每个component bits数目
  627. size_t bytesPerRow = width * 4; // 一张图片每行字节数目 (每个像素点包含r g b a 四个字节)
  628. CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); // 创建rgb颜色空间
  629. CGContextRef context = CGBitmapContextCreate(data, width,height,bitsPerComponent,bytesPerRow,space,kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
  630. CGContextDrawImage(context, CGRectMake(0, 0, width, height), cgimage);
  631. int top = 0; // 上边框透明高度
  632. int left = 0; // 左边框透明高度
  633. int right = 0; // 右边框透明高度
  634. int bottom = 0; // 底边框透明高度
  635. for (size_t row = 0; row < height; row++) {
  636. BOOL find = false;
  637. for (size_t col = 0; col < width; col++) {
  638. size_t pixelIndex = (row * width + col) * 4;
  639. // int red = data[pixelIndex];
  640. // int green = data[pixelIndex+1];
  641. // int blue = data[pixelIndex + 2];
  642. int alpha = data[pixelIndex + 3];
  643. if (alpha != 0) {
  644. find = YES;
  645. break;
  646. }
  647. }
  648. if (find) {
  649. break;
  650. }
  651. top ++;
  652. }
  653. for (size_t col = 0; col < width; col++) {
  654. BOOL find = false;
  655. for (size_t row = 0; row < height; row++) {
  656. size_t pixelIndex = (row * width + col) * 4;
  657. int alpha = data[pixelIndex + 3];
  658. if (alpha != 0) {
  659. find = YES;
  660. break;
  661. }
  662. }
  663. if (find) {
  664. break;
  665. }
  666. left ++;
  667. }
  668. for (size_t col = width - 1; col > 0; col--) {
  669. BOOL find = false;
  670. for (size_t row = 0; row < height; row++) {
  671. size_t pixelIndex = (row * width + col) * 4;
  672. int alpha = data[pixelIndex + 3];
  673. if (alpha != 0) {
  674. find = YES;
  675. break;
  676. }
  677. }
  678. if (find) {
  679. break;
  680. }
  681. right ++;
  682. }
  683. for (size_t row = height - 1; row > 0; row--) {
  684. BOOL find = false;
  685. for (size_t col = 0; col < width; col++) {
  686. size_t pixelIndex = (row * width + col) * 4;
  687. int alpha = data[pixelIndex + 3];
  688. if (alpha != 0) {
  689. find = YES;
  690. break;
  691. }
  692. }
  693. if (find) {
  694. break;
  695. }
  696. bottom ++;
  697. }
  698. CGFloat scale = image.scale;
  699. CGImageRef newImageRef = CGImageCreateWithImageInRect(cgimage, CGRectMake(left * scale, top *scale, (image.size.width - left - right)*scale, (image.size.height - top - bottom)*scale));
  700. UIImage *newImage = [UIImage imageWithCGImage:newImageRef];
  701. // 释放
  702. CGImageRelease(cgimage);
  703. CGContextRelease(context);
  704. CGColorSpaceRelease(space);
  705. return newImage;
  706. }
  707. + (UIWindow *)getKeyWindow {
  708. UIWindow* window = nil;
  709. if (@available(iOS 13.0, *))
  710. {
  711. for (UIWindowScene* windowScene in [UIApplication sharedApplication].connectedScenes)
  712. {
  713. if (windowScene.activationState == UISceneActivationStateForegroundActive)
  714. {
  715. window = windowScene.windows.firstObject;
  716. break;
  717. }
  718. }
  719. }else{
  720. window = [UIApplication sharedApplication].keyWindow;
  721. }
  722. return window;
  723. }
  724. //调整相机拍摄的图片方向
  725. + (UIImage *)fixOrientation:(UIImage *)srcImg {
  726. if (srcImg.imageOrientation ==UIImageOrientationUp) return srcImg;
  727. CGAffineTransform transform =CGAffineTransformIdentity;
  728. switch (srcImg.imageOrientation) {
  729. case UIImageOrientationDown:
  730. case UIImageOrientationDownMirrored:
  731. transform = CGAffineTransformTranslate(transform, srcImg.size.width, srcImg.size.height);
  732. transform = CGAffineTransformRotate(transform,M_PI);
  733. break;
  734. case UIImageOrientationLeft:
  735. case UIImageOrientationLeftMirrored:
  736. transform = CGAffineTransformTranslate(transform, srcImg.size.width,0);
  737. transform = CGAffineTransformRotate(transform,M_PI_2);
  738. break;
  739. case UIImageOrientationRight:
  740. case UIImageOrientationRightMirrored:
  741. transform = CGAffineTransformTranslate(transform,0, srcImg.size.height);
  742. transform = CGAffineTransformRotate(transform, -M_PI_2);
  743. break;
  744. case UIImageOrientationUp:
  745. case UIImageOrientationUpMirrored:
  746. break;
  747. }
  748. switch (srcImg.imageOrientation) {
  749. case UIImageOrientationUpMirrored:
  750. case UIImageOrientationDownMirrored:
  751. transform = CGAffineTransformTranslate(transform, srcImg.size.width,0);
  752. transform = CGAffineTransformScale(transform, -1,1);
  753. break;
  754. case UIImageOrientationLeftMirrored:
  755. case UIImageOrientationRightMirrored:
  756. transform = CGAffineTransformTranslate(transform, srcImg.size.height,0);
  757. transform = CGAffineTransformScale(transform, -1,1);
  758. break;
  759. case UIImageOrientationUp:
  760. case UIImageOrientationDown:
  761. case UIImageOrientationLeft:
  762. case UIImageOrientationRight:
  763. break;
  764. }
  765. CGContextRef ctx =CGBitmapContextCreate(NULL, srcImg.size.width, srcImg.size.height,
  766. CGImageGetBitsPerComponent(srcImg.CGImage),0,
  767. CGImageGetColorSpace(srcImg.CGImage),
  768. CGImageGetBitmapInfo(srcImg.CGImage));
  769. CGContextConcatCTM(ctx, transform);
  770. switch (srcImg.imageOrientation) {
  771. case UIImageOrientationLeft:
  772. case UIImageOrientationLeftMirrored:
  773. case UIImageOrientationRight:
  774. case UIImageOrientationRightMirrored:
  775. CGContextDrawImage(ctx,CGRectMake(0,0,srcImg.size.height,srcImg.size.width), srcImg.CGImage);
  776. break;
  777. default:
  778. CGContextDrawImage(ctx,CGRectMake(0,0,srcImg.size.width,srcImg.size.height), srcImg.CGImage);
  779. break;
  780. }
  781. CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
  782. UIImage *img = [UIImage imageWithCGImage:cgimg];
  783. CGContextRelease(ctx);
  784. CGImageRelease(cgimg);
  785. return img;
  786. }
  787. //ypp add 推流业务随机生成6位数的字符串
  788. + (NSString *)getTaskUidStr {
  789. int randomNumber = (int) arc4random_uniform(999999) + 100000;
  790. NSString *strRandom = [NSString stringWithFormat:@"%d",randomNumber];
  791. return strRandom;
  792. }
  793. @end