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

//
//
#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