NSString+convert.m 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543
  1. //
  2. // NSString+convert.m
  3. // ZigBeeGatewayPublic
  4. //
  5. // Created by coderYK on 2018/9/5.
  6. // Copyright © 2018年 coderYK. All rights reserved.
  7. //
  8. #import "NSString+convert.h"
  9. @implementation NSString (convert)
  10. - (int)rds_intValueFromHexString{
  11. int value = (int)[self rds_uintegerValueFromHexString];
  12. return value;
  13. }
  14. - (NSUInteger)rds_uintegerValueFromHexString {
  15. NSString *hexString = [NSString stringWithFormat:@"%@", self]; // 防止类型不对
  16. if (hexString.length%2) {
  17. hexString = [NSString stringWithFormat:@"0%@", hexString];
  18. }
  19. return strtoul([hexString UTF8String], NULL, 16);
  20. }
  21. - (NSString *)rds_decimalFromHexString{
  22. NSString *hexString = [NSString stringWithFormat:@"%@", self]; // 防止类型不对
  23. if (hexString.length%2) {
  24. hexString = [NSString stringWithFormat:@"0%@", hexString];
  25. }
  26. NSString *result = [NSString stringWithFormat:@"%lu",strtoul([hexString UTF8String], 0, 16)];
  27. return result;
  28. }
  29. - (NSUInteger)rds_uintegerValueFromBinaryString {
  30. NSString *bString = [NSString stringWithFormat:@"%@", self]; // 防止类型不对
  31. if (bString.length%2) {
  32. bString = [NSString stringWithFormat:@"0%@", bString];
  33. }
  34. return strtoul([bString UTF8String], NULL, 2);
  35. }
  36. - (NSInteger)rds_numberWithHexString{
  37. const char *hexChar = [self cStringUsingEncoding:NSUTF8StringEncoding];
  38. int hexNumber;
  39. sscanf(hexChar, "%x", &hexNumber);
  40. return (NSInteger)hexNumber;
  41. }
  42. - (NSString *)rds_getHexFromDecimal{
  43. NSString *decimalString = [NSString stringWithFormat:@"%@", self]; // 防止类型不对
  44. NSString *result = [NSString stringWithFormat:@"%02x",decimalString.intValue];
  45. if (result.length == 3) {
  46. result = [NSString stringWithFormat:@"0%@",result];
  47. }
  48. return result;
  49. }
  50. // 将十进制转化为十六进制
  51. + (NSString *)rds_getHexByDecimal:(int)decimal{
  52. NSString *nLetterValue;
  53. NSString *str =@"";
  54. int number;
  55. for (int i = 0; i<9; i++) {
  56. number = decimal % 16;
  57. decimal = decimal / 16;
  58. switch (number){
  59. case 10:
  60. nLetterValue =@"A";break;
  61. case 11:
  62. nLetterValue =@"B";break;
  63. case 12:
  64. nLetterValue =@"C";break;
  65. case 13:
  66. nLetterValue =@"D";break;
  67. case 14:
  68. nLetterValue =@"E";break;
  69. case 15:
  70. nLetterValue =@"F";break;
  71. default:
  72. nLetterValue = [NSString stringWithFormat:@"%u",number];
  73. }
  74. str = [nLetterValue stringByAppendingString:str];
  75. if (decimal == 0) {
  76. break;
  77. }
  78. }
  79. //不够一个字节凑 补0
  80. if (str.length % 2 != 0){
  81. str = [NSString stringWithFormat:@"0%@",str];
  82. }
  83. return str;
  84. }
  85. - (NSString *)rds_stringFromHexString {
  86. NSString *hexString = self;
  87. NSUInteger count = hexString.length/2;
  88. char *buffer = malloc(count+1);
  89. if (buffer == NULL) return nil;
  90. for (int i=0; i<count; i++) {
  91. // 0211 6c 6f 76 65 79 6f 75 62 11 76 84 5f c3 90 fd 00 01
  92. NSUInteger value = [[hexString substringWithRange:NSMakeRange(i*2, 2)] rds_uintegerValueFromHexString];
  93. buffer[i] = value;
  94. }
  95. NSData *strData = [NSData dataWithBytes:buffer length:count];
  96. NSString *unicodeString = [[NSString alloc] initWithData:strData encoding:NSUnicodeStringEncoding];
  97. unicodeString = [NSString stringWithCString:[unicodeString UTF8String] encoding:NSUTF8StringEncoding]; // 去掉 unicodeString 后面多余的\0
  98. free(buffer);
  99. buffer = NULL;
  100. return unicodeString;
  101. }
  102. // ascii码十六进制转换为普通字符串的。
  103. - (NSString *)rds_stringFromAsciiHexString {
  104. NSString *hexString = self;
  105. hexString = [hexString stringByReplacingOccurrencesOfString:@"ff" withString:@""];// 删除用于补位的f
  106. if (kNULLString(hexString)) {
  107. return @"";
  108. }
  109. char *myBuffer = (char *)malloc((int)[hexString length] / 2 + 1);
  110. bzero(myBuffer, [hexString length] / 2 + 1);
  111. for (int i = 0; i < [hexString length] - 1; i += 2) {
  112. unsigned int anInt;
  113. NSString * hexCharStr;
  114. if (hexString.length >= i + 2) {
  115. hexCharStr = [hexString substringWithRange:NSMakeRange(i, 2)];
  116. }else{
  117. DDLog(@"ascii码十六进制转换为普通字符串的出错");
  118. return nil;
  119. }
  120. NSScanner * scanner = [[NSScanner alloc] initWithString:hexCharStr];
  121. [scanner scanHexInt:&anInt];
  122. myBuffer[i / 2] = (char)anInt;
  123. }
  124. NSString *unicodeString = [NSString stringWithCString:myBuffer encoding:4];
  125. //DDLog(@"\n%@\n%@", hexString, unicodeString);
  126. if (kNULLString(unicodeString)) {
  127. unicodeString = @"";
  128. }
  129. return unicodeString;
  130. }
  131. //普通字符串转换为ascii码十六进制的。
  132. - (NSString *)rds_stringToAsciiHexString{
  133. NSString *string = self;
  134. NSData *myD = [string dataUsingEncoding:NSUTF8StringEncoding];
  135. Byte *bytes = (Byte *)[myD bytes];
  136. //下面是Byte 转换为16进制。
  137. NSString *hexStr=@"";
  138. for(int i=0;i<[myD length];i++)
  139. {
  140. NSString *newHexStr = [NSString stringWithFormat:@"%x",bytes[i]&0xff];///16进制数
  141. if([newHexStr length]==1)
  142. hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr];
  143. else
  144. hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr];
  145. }
  146. return hexStr;
  147. }
  148. - (NSString *)rds_stringToAsciiString{
  149. NSString *string = self;
  150. NSMutableString *mustring = [[NSMutableString alloc] init];
  151. const char *ch = [string cStringUsingEncoding:NSASCIIStringEncoding];
  152. if(!ch) return nil;
  153. for (int i = 0; i < strlen(ch); i++) {
  154. [mustring appendString:[NSString stringWithFormat:@"%x", ch[i]]];
  155. }
  156. return mustring;
  157. }
  158. - (NSString *)rds_binaryStringReversed {
  159. // 逆序
  160. NSString *binaryString = self;
  161. unsigned long len;
  162. len = [binaryString length];
  163. unichar a[len];
  164. for(int i = 0; i < len; i++)
  165. {
  166. unichar c = [binaryString characterAtIndex:len-i-1];
  167. a[i] = c;
  168. }
  169. NSString *orderBinaryString= [NSString stringWithCharacters:a length:len];
  170. return orderBinaryString;
  171. }
  172. - (NSArray *)rds_indexArrayFromexIDString {
  173. NSString *hexIDString = self;
  174. NSString *bString = [hexIDString rds_getBinaryFromHex];
  175. return [bString rds_indexArrayFromBinaryString];
  176. }
  177. - (NSArray *)rds_indexArrayFromBinaryString {
  178. NSString *binaryIDString = self;
  179. NSMutableString *reverseStr = [binaryIDString rds_binaryStringReversed];
  180. NSMutableArray *tempArr = [NSMutableArray array];
  181. for (int i = 0; i < reverseStr.length; i++) {
  182. if ([reverseStr characterAtIndex:i] == 49) {
  183. [tempArr addObject:@(i)];
  184. }
  185. }
  186. return [tempArr copy];
  187. }
  188. - (NSString *)rds_getBinaryFromHex {
  189. NSString *hex = self;
  190. NSMutableDictionary *hexDic = [[NSMutableDictionary alloc] init];
  191. hexDic = [[NSMutableDictionary alloc] initWithCapacity:16];
  192. [hexDic setObject:@"0000" forKey:@"0"];
  193. [hexDic setObject:@"0001" forKey:@"1"];
  194. [hexDic setObject:@"0010" forKey:@"2"];
  195. [hexDic setObject:@"0011" forKey:@"3"];
  196. [hexDic setObject:@"0100" forKey:@"4"];
  197. [hexDic setObject:@"0101" forKey:@"5"];
  198. [hexDic setObject:@"0110" forKey:@"6"];
  199. [hexDic setObject:@"0111" forKey:@"7"];
  200. [hexDic setObject:@"1000" forKey:@"8"];
  201. [hexDic setObject:@"1001" forKey:@"9"];
  202. [hexDic setObject:@"1010" forKey:@"a"];
  203. [hexDic setObject:@"1011" forKey:@"b"];
  204. [hexDic setObject:@"1100" forKey:@"c"];
  205. [hexDic setObject:@"1101" forKey:@"d"];
  206. [hexDic setObject:@"1110" forKey:@"e"];
  207. [hexDic setObject:@"1111" forKey:@"f"];
  208. NSMutableString *binaryString=[[NSMutableString alloc] init];
  209. for (int i=0; i<[hex length]; i++) {
  210. NSRange rage;
  211. rage.length = 1;
  212. rage.location = i;
  213. NSString *key = [hex substringWithRange:rage];
  214. binaryString = [NSString stringWithFormat:@"%@%@",binaryString,[NSString stringWithFormat:@"%@",[hexDic objectForKey:key]]];
  215. }
  216. return binaryString;
  217. }
  218. - (NSString *)rds_getHexByBinary {
  219. // NSString *dec = [self getDecimalByBinary:binary];
  220. // NSString *hex = [self getHexByDecimal:dec];
  221. NSString *binary = self;
  222. NSMutableDictionary *binaryDic = [[NSMutableDictionary alloc] initWithCapacity:16];
  223. [binaryDic setObject:@"0" forKey:@"0000"];
  224. [binaryDic setObject:@"1" forKey:@"0001"];
  225. [binaryDic setObject:@"2" forKey:@"0010"];
  226. [binaryDic setObject:@"3" forKey:@"0011"];
  227. [binaryDic setObject:@"4" forKey:@"0100"];
  228. [binaryDic setObject:@"5" forKey:@"0101"];
  229. [binaryDic setObject:@"6" forKey:@"0110"];
  230. [binaryDic setObject:@"7" forKey:@"0111"];
  231. [binaryDic setObject:@"8" forKey:@"1000"];
  232. [binaryDic setObject:@"9" forKey:@"1001"];
  233. [binaryDic setObject:@"A" forKey:@"1010"];
  234. [binaryDic setObject:@"B" forKey:@"1011"];
  235. [binaryDic setObject:@"C" forKey:@"1100"];
  236. [binaryDic setObject:@"D" forKey:@"1101"];
  237. [binaryDic setObject:@"E" forKey:@"1110"];
  238. [binaryDic setObject:@"F" forKey:@"1111"];
  239. if (binary.length % 4 != 0) {
  240. NSMutableString *mStr = [[NSMutableString alloc]init];;
  241. for (int i = 0; i < 4 - binary.length % 4; i++) {
  242. [mStr appendString:@"0"];
  243. }
  244. binary = [mStr stringByAppendingString:binary];
  245. }
  246. NSString *hex = @"";
  247. for (int i=0; i<binary.length; i+=4) {
  248. NSString *key = [binary substringWithRange:NSMakeRange(i, 4)];
  249. NSString *value = [binaryDic objectForKey:key];
  250. if (value) {
  251. hex = [hex stringByAppendingString:value];
  252. }
  253. }
  254. return hex;
  255. }
  256. - (NSString *)rds_filterUnfitCharactor {
  257. NSString *filterText = self;
  258. NSError *error = NULL;
  259. NSString *regexStr = @"[^a-zA-Z0-9\u4e00-\u9fa5]";
  260. NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regexStr options:NSRegularExpressionCaseInsensitive error:&error];
  261. NSString *result = [regex stringByReplacingMatchesInString:filterText options:NSMatchingReportCompletion range:NSMakeRange(0, filterText.length) withTemplate:@""];
  262. return result;
  263. }
  264. - (NSString *)rds_stringTohexString {
  265. NSString *string = self;
  266. // // 一个汉字2字节
  267. //
  268. // NSMutableString *strM = [NSMutableString string];
  269. // for (int i=0; i<string.length; i++) {
  270. // NSString *code = [NSString stringWithFormat:@"%04x", [string characterAtIndex:i]];
  271. // [strM appendString:code];
  272. // }
  273. // return strM;
  274. NSData *myD = [string dataUsingEncoding:NSUTF8StringEncoding];
  275. Byte *bytes = (Byte *)[myD bytes]; //下面是Byte 转换为16进制。
  276. NSString *hexStr=@"";
  277. for(int i=0;i<[myD length];i++){
  278. NSString *newHexStr = [NSString stringWithFormat:@"%x",bytes[i]&0xff];///16进制数
  279. if([newHexStr length]==1)
  280. hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr];
  281. else
  282. hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr];
  283. }
  284. return hexStr;
  285. }
  286. - (NSString *)rds_getAsciiHexStringFromStringByte:(NSUInteger)byte {
  287. NSString *hexName = [self rds_stringToAsciiHexString];
  288. int offset = (int)(byte*2 - hexName.length);
  289. for (int i = 0; i < offset; i++) {
  290. hexName = [NSString stringWithFormat:@"%@f",hexName];
  291. }
  292. return hexName;
  293. }
  294. + (NSString *)rds_ChineseNumFrom:(NSUInteger)number {
  295. static NSNumberFormatter *formatter;
  296. if (formatter == nil) {
  297. formatter = [[NSNumberFormatter alloc] init];
  298. formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"zh_CN"];
  299. formatter.numberStyle = kCFNumberFormatterSpellOutStyle;//kCFNumberFormatterRoundHalfDown;
  300. }
  301. return [formatter stringFromNumber:[NSNumber numberWithUnsignedInteger:number]];
  302. }
  303. - (NSString *)rds_utf8ToUnicode{
  304. NSString *string = self;
  305. NSUInteger length = [string length];
  306. NSMutableString *str = [NSMutableString stringWithCapacity:0];
  307. for (int i = 0;i < length; i++){
  308. NSMutableString *s = [NSMutableString stringWithCapacity:0];
  309. unichar _char = [string characterAtIndex:i];
  310. // 判断是否为英文和数字
  311. if (_char <= '9' && _char >='0'){
  312. [s appendFormat:@"%@",[string substringWithRange:NSMakeRange(i,1)]];
  313. }else if(_char >='a' && _char <= 'z'){
  314. [s appendFormat:@"%@",[string substringWithRange:NSMakeRange(i,1)]];
  315. }else if(_char >='A' && _char <= 'Z')
  316. {
  317. [s appendFormat:@"%@",[string substringWithRange:NSMakeRange(i,1)]];
  318. }else{
  319. // 中文和字符
  320. [s appendFormat:@"\\u%x",[string characterAtIndex:i]];
  321. // 不足位数补0 否则解码不成功
  322. if(s.length == 4) {
  323. [s insertString:@"00" atIndex:2];
  324. } else if (s.length == 5) {
  325. [s insertString:@"0" atIndex:2];
  326. }
  327. }
  328. [str appendFormat:@"%@", s];
  329. }
  330. str = [str stringByReplacingOccurrencesOfString:@"\\u" withString:@""];
  331. return str;
  332. }
  333. + (NSString *)rds_stringFromDict:(NSDictionary *)dict{
  334. NSData *data=[NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil];
  335. NSString *jsonStr=[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
  336. return jsonStr;
  337. }
  338. - (NSData *)rds_getDataFromString{
  339. NSData *data =[self dataUsingEncoding:NSUTF8StringEncoding];
  340. return data;
  341. }
  342. - (NSData *)rds_getDataFromHexString{
  343. NSString *string = self;
  344. NSMutableData* data = [NSMutableData data];
  345. int idx;
  346. for (idx = 0; idx+2 <= string.length; idx+=2) {
  347. NSRange range = NSMakeRange(idx, 2);
  348. NSString* hexStr = [string substringWithRange:range];
  349. NSScanner* scanner = [NSScanner scannerWithString:hexStr];
  350. unsigned int intValue;
  351. [scanner scanHexInt:&intValue];
  352. [data appendBytes:&intValue length:1];
  353. }
  354. return data;
  355. }
  356. + (NSString *)rds_getHexStringFromData:(NSData *)data{
  357. if (!data || [data length] == 0) {
  358. return @"";
  359. }
  360. NSMutableString *string = [[NSMutableString alloc] initWithCapacity:[data length]];
  361. [data enumerateByteRangesUsingBlock:^(const void *bytes, NSRange byteRange, BOOL *stop) {
  362. unsigned char *dataBytes = (unsigned char*)bytes;
  363. for (NSInteger i = 0; i < byteRange.length; i++) {
  364. NSString *hexStr = [NSString stringWithFormat:@"%x", (dataBytes[i]) & 0xff];
  365. if ([hexStr length] == 2) {
  366. [string appendString:hexStr];
  367. } else {
  368. [string appendFormat:@"0%@", hexStr];
  369. }
  370. }
  371. }];
  372. return string;
  373. }
  374. + (NSString *)rds_getHexStringFromNSData:(NSData *)data{
  375. return [[[[NSString stringWithFormat:@"%@",data]
  376. stringByReplacingOccurrencesOfString:@"<" withString:@""]
  377. stringByReplacingOccurrencesOfString:@">" withString:@""]
  378. stringByReplacingOccurrencesOfString:@" " withString:@""];
  379. }
  380. + (NSString *)rds_getStringFromData:(NSData *)data{
  381. NSString *result =[[ NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  382. return result;
  383. }
  384. // 大小端
  385. - (NSString *)rds_changeLittleEndian{
  386. // 大端转成小端
  387. NSString *tmpStr = self;
  388. NSMutableArray *tmpArra = [NSMutableArray array];
  389. for (int i = 0 ; i<tmpStr.length ;i+=2) {
  390. NSString *str = [tmpStr substringWithRange:NSMakeRange(i, 2)];
  391. [tmpArra addObject:str];
  392. }
  393. NSArray *lastArray = [[tmpArra reverseObjectEnumerator] allObjects];
  394. NSMutableString *lastStr = [NSMutableString string];
  395. for (NSString *str in lastArray) {
  396. [lastStr appendString:str];
  397. }
  398. return lastStr.copy;
  399. }
  400. - (NSString *)addZeroWithLength:(int)length{
  401. NSString *string = nil;
  402. NSString *orgStr = self;
  403. if (kNULLString(orgStr)) {
  404. orgStr = @"";
  405. }
  406. if (orgStr.length<length) {
  407. NSUInteger inter = length-orgStr.length;
  408. for (int i=0;i< inter; i++) {
  409. string = [NSString stringWithFormat:@"%@*",orgStr];
  410. orgStr = string;
  411. }
  412. }
  413. return orgStr;
  414. }
  415. - (NSString *)rds_changeFistUppercase{
  416. NSString *dealString = self;
  417. NSString *resultString = @"";
  418. if (dealString.length > 0) {
  419. resultString = [dealString stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:[[dealString substringToIndex:1] capitalizedString]];
  420. //lowercaseString
  421. resultString = [resultString stringByReplacingCharactersInRange:NSMakeRange(1,dealString.length-1) withString:[[dealString substringFromIndex:1] lowercaseString]];
  422. }
  423. return resultString;
  424. }
  425. + (NSString*)rds_dicToJson:(NSDictionary *)dic
  426. {
  427. NSError *parseError = nil;
  428. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:&parseError];
  429. return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  430. }
  431. + (NSDictionary *)rds_jsonToDic:(NSString *)json{
  432. if (json == nil){
  433. return nil;
  434. }
  435. //所有控制符都会被替换成空字符。
  436. NSString *jsonString =[json stringByTrimmingCharactersInSet:[NSCharacterSet controlCharacterSet]];
  437. NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
  438. NSError *error;
  439. NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:jsonData
  440. options:NSJSONReadingMutableContainers
  441. error:&error];
  442. if (error){
  443. NSLog(@"json格式string解析失败:%@",error);
  444. return nil;
  445. }
  446. return dict;
  447. }
  448. @end