You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
209 lines
6.2 KiB
209 lines
6.2 KiB
// |
|
// |
|
|
|
#import "FRIConvert.h" |
|
|
|
@implementation FRIConvert |
|
|
|
//小端转化到大端 |
|
+(NSString *)convertHexEndianToEndian:(NSString *)littleHex |
|
{ |
|
littleHex = [littleHex stringByReplacingOccurrencesOfString:@"0x" withString:@""]; |
|
littleHex = [littleHex stringByReplacingOccurrencesOfString:@"0X" withString:@""]; |
|
|
|
NSMutableArray *tempArr = [NSMutableArray array]; |
|
for (int i = 0; i < littleHex.length; i +=2) { |
|
[tempArr addObject:[littleHex substringWithRange:NSMakeRange(i, 2)]]; |
|
} |
|
|
|
NSMutableString *reverseHexStr = [NSMutableString string]; |
|
[tempArr enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(NSString *hexWord, NSUInteger idx, BOOL * _Nonnull stop) { |
|
[reverseHexStr appendString:hexWord]; |
|
}]; |
|
return reverseHexStr; |
|
} |
|
|
|
+(NSData*)noPrexHexStrToData:(NSString*)str |
|
{ |
|
NSString *command = [str stringByReplacingOccurrencesOfString:@" " withString:@""]; |
|
NSMutableData *commandToSend= [[NSMutableData alloc] init]; |
|
unsigned char whole_byte; |
|
char byte_chars[3] = {'\0','\0','\0'}; |
|
int i; |
|
for (i=0; i < command.length/2; i++) { |
|
byte_chars[0] = [command characterAtIndex:i*2]; |
|
byte_chars[1] = [command characterAtIndex:i*2+1]; |
|
whole_byte = strtol(byte_chars, NULL, 16); |
|
[commandToSend appendBytes:&whole_byte length:1]; |
|
} |
|
return commandToSend; |
|
} |
|
|
|
|
|
+ (NSData *)prexHexStrToData:(NSString *)str{ |
|
if (!str || [str length] == 0||str.length<=2) { |
|
return nil; |
|
} |
|
|
|
str = [str stringByReplacingOccurrencesOfString:@"0x" withString:@""]; |
|
str = [str stringByReplacingOccurrencesOfString:@"0X" withString:@""]; |
|
|
|
NSMutableData *hexData = [[NSMutableData alloc] initWithCapacity:8]; |
|
NSRange range = NSMakeRange(0, 2); |
|
for (NSInteger i = range.location; i < [str length]; i += 2) { |
|
unsigned int anInt; |
|
NSString *hexCharStr = [str substringWithRange:range]; |
|
NSScanner *scanner = [[NSScanner alloc] initWithString:hexCharStr]; |
|
|
|
[scanner scanHexInt:&anInt]; |
|
NSData *entity = [[NSData alloc] initWithBytes:&anInt length:1]; |
|
[hexData appendData:entity]; |
|
|
|
range.location += range.length; |
|
range.length = 2; |
|
} |
|
|
|
return hexData; |
|
} |
|
|
|
+ (NSString *)noPrexHexStrFromDecimal:(NSInteger)decimal |
|
{ |
|
NSString *hex =@""; |
|
NSString *letter; |
|
NSInteger number; |
|
for (int i = 0; i<9; i++) { |
|
number = decimal % 16; |
|
decimal = decimal / 16; |
|
switch (number) { |
|
case 10: |
|
letter =@"A"; break; |
|
case 11: |
|
letter =@"B"; break; |
|
case 12: |
|
letter =@"C"; break; |
|
case 13: |
|
letter =@"D"; break; |
|
case 14: |
|
letter =@"E"; break; |
|
case 15: |
|
letter =@"F"; break; |
|
default: |
|
letter = [NSString stringWithFormat:@"%ld", (long)number]; |
|
} |
|
hex = [letter stringByAppendingString:hex]; |
|
if (decimal == 0) { |
|
|
|
break; |
|
} |
|
} |
|
if (hex.length == 1) { |
|
hex = [NSString stringWithFormat:@"0%@",hex]; |
|
} |
|
return hex; |
|
} |
|
|
|
|
|
+ (NSNumber *)decimalFromData:(NSData *)data{ |
|
|
|
NSString *noPrexHexStr = [FRIConvert noPrexHexStrFromData:data]; |
|
return [FRIConvert decimalFromHexStr:noPrexHexStr]; |
|
} |
|
|
|
+(NSData *)dataForDecimal:(NSInteger)decimal{ |
|
NSString *conentHexStr = [FRIConvert noPrexHexStrFromDecimal:decimal]; |
|
return [FRIConvert noPrexHexStrToData:conentHexStr]; |
|
} |
|
|
|
+ (NSString *)noPrexHexStrFromData:(NSData *)data |
|
{ |
|
Byte *bytes = (Byte *)[data bytes]; |
|
//下面是Byte 转换为16进制 |
|
NSString *hexStr=@""; |
|
for(int i=0;i<[data length];i++){ |
|
NSString *newHexStr = [NSString stringWithFormat:@"%x",bytes[i]&0xff];///16进制数 |
|
if([newHexStr length]==1){ |
|
hexStr = [NSString stringWithFormat:@"%@0%@",hexStr,newHexStr]; |
|
}else{ |
|
hexStr = [NSString stringWithFormat:@"%@%@",hexStr,newHexStr]; |
|
} |
|
} |
|
return hexStr; |
|
} |
|
|
|
|
|
//补位的方法 |
|
+(NSString*)addString:(NSString*)string length:(NSInteger)length onString:(NSString*)str{ |
|
|
|
NSMutableString * nullStr = [[NSMutableString alloc] initWithString:@""]; |
|
if (length > str.length) { |
|
for (int i = 0; i< (length-str.length); i++) { |
|
[nullStr appendString:string]; |
|
} |
|
} |
|
return [NSString stringWithFormat:@"%@%@",nullStr,str]; |
|
} |
|
|
|
+(NSString *)prexHexStrFromData:(NSData *)data{ |
|
return [NSString stringWithFormat:@"0x%@",[self noPrexHexStrFromData:data]]; |
|
|
|
} |
|
|
|
+ (NSNumber *)decimalFromHexStr:(NSString *)aHexString{ |
|
// 为空,直接返回. |
|
if (!aHexString){ |
|
return nil; |
|
} |
|
|
|
NSScanner * scanner = [NSScanner scannerWithString:aHexString]; |
|
unsigned long long longlongValue; |
|
[scanner scanHexLongLong:&longlongValue]; |
|
return @(longlongValue); |
|
|
|
} |
|
|
|
+(NSData *)littleEndianDataFrom:(NSData *)data{ |
|
|
|
NSMutableData *newCopyData = [NSMutableData dataWithLength:data.length]; |
|
@autoreleasepool { |
|
int intLen = 4; |
|
int idx = 0; |
|
BOOL needLoop = YES; |
|
do { |
|
int needClipLen = intLen; |
|
if (idx + intLen > data.length) { |
|
needClipLen = data.length - idx; |
|
needLoop = NO; |
|
} |
|
|
|
NSData *tempData = [self littleEndianDataFrom:data location:idx offset:needClipLen]; |
|
if (tempData) { |
|
[newCopyData appendData:tempData]; |
|
} |
|
|
|
} while (needLoop); |
|
} |
|
return newCopyData; |
|
} |
|
|
|
|
|
+(NSData *)littleEndianDataFrom:(NSData *)data location:(NSInteger)location offset:(NSInteger)offset{ |
|
|
|
NSData *intdata= [data subdataWithRange:NSMakeRange(location, offset)]; |
|
if (offset == 2 ) { |
|
uint16_t value=CFSwapInt16BigToHost(*(int*)([intdata bytes])); |
|
return [NSData dataWithBytes:&value length:offset]; |
|
} |
|
else if (offset == 4) { |
|
uint32_t value = CFSwapInt32BigToHost(*(int*)([intdata bytes])); |
|
return [NSData dataWithBytes:&value length:offset]; |
|
} |
|
else if (offset == 1) { |
|
unsigned char *bs = (unsigned char *)[[data subdataWithRange:NSMakeRange(location, 1) ] bytes]; |
|
return [NSData dataWithBytes:bs length:offset]; |
|
} |
|
return nil; |
|
} |
|
|
|
@end |
|
|
|
|
|
|