JAVA专业字符串按进制转换补码获取其值的算法直接用parseInt()一句代码即可,OC的话可按照补码的原理一步步实现.
补码:正整数的补码是本身,负数的补码是除符号位全部取反再加一.
如题,要想实现算法,将字符串按照十六进制每两位进行求补码运算获取byte数组即可.
+(int )HexToByte:(NSString *)hexString{
NSInteger length =hexString.length/2;
Byte res[length];
int sum =0;
for(int i=0;i<[hexString length]/2;i++)
{
int int_ch; /// 两位16进制数转化后的10进制数
unichar hex_char1 = [hexString characterAtIndex:i*2]; 两位16进制数中的第一位(高位*16)
int int_ch1;
if(hex_char1 >= '0' && hex_char1 <='9')
int_ch1 = (hex_char1-48)*16; 0 的Ascll - 48
else if(hex_char1 >= 'A' && hex_char1 <='F')
int_ch1 = (hex_char1-55)*16; A 的Ascll - 65
else
int_ch1 = (hex_char1-87)*16; a 的Ascll - 97
unichar hex_char2 = [hexString characterAtIndex:i*2+1]; ///两位16进制数中的第二位(低位)
int int_ch2;
if(hex_char2 >= '0' && hex_char2 <='9')
int_ch2 = (hex_char2-48); 0 的Ascll - 48
else if(hex_char2 >= 'A' && hex_char2 <='F')
int_ch2 = hex_char2-55; A 的Ascll - 65
else
int_ch2 = hex_char2-87; a 的Ascll - 97
int_ch = int_ch1+int_ch2;
BOOL complentResult = [self toBinarySystemWithDecimalSystem:int_ch];
if (!complentResult) {
res[i] = 256 - int_ch;
sum = sum - res[i];
}else {
res[i] = int_ch;
///将转化后的数放入Byte数组里
sum = sum +res[i];
}
}
return sum;
}
+ (BOOL)toBinarySystemWithDecimalSystem:(NSInteger)decimal
{
NSInteger num = decimal;//[decimal intValue];
NSInteger remainder = 0; //余数
NSInteger divisor = 0; //除数
NSString * prepare = @"";
while (true)
{
remainder = num%2;
divisor = num/2;
num = divisor;
prepare = [prepare stringByAppendingFormat:@"%ld",remainder];
if (divisor == 0)
{
break;
}
}
NSString * result = @"";
for (NSInteger i = prepare.length - 1; i >= 0; i --)
{
result = [result stringByAppendingFormat:@"%@",
[prepare substringWithRange:NSMakeRange(i , 1)]];
}
result = [self resultCompleted:result];
unichar firstChar = [result characterAtIndex:0];
BOOL complent;
if(firstChar == '0'){
complent = YES;
}else if (firstChar == '1'){
complent = NO;
}else{
complent = NO;
}
return complent;
}
+ (NSString *)toHexStringWithNum:(NSInteger )num{
NSInteger remainder = 0; //余数
NSInteger divisor = 0; //除数
NSString * prepare = @"";
NSArray *arr = @[@"A",@"B",@"C",@"D",@"E",@"F"];
while (true)
{
remainder = num%16;
divisor = num/16;
num = divisor;
if (remainder>9) {
NSInteger index = remainder - 10;
prepare = [prepare stringByAppendingFormat:@"%@", arr[index]];
}else{
prepare = [prepare stringByAppendingFormat:@"%ld",remainder];
}
if (divisor == 0)
{
break;
}
}
NSString * result = @"";
for (NSInteger i = prepare.length - 1; i >= 0; i --)
{
result = [result stringByAppendingFormat:@"%@",
[prepare substringWithRange:NSMakeRange(i , 1)]];
}
return result;
}
#pragma mark 自动补齐8位
+ (NSString *)resultCompleted:(NSString *)resultString{
NSUInteger lengthAdd = 8- resultString.length;
NSString *strZero = resultString;
for (int i=0; i<lengthAdd; i++) {
strZero =[NSString stringWithFormat:@"0%@",strZero];
}
return strZero;
}
PS:代码中还包括了后续的将补码值转为十六进制字符等操作.代码实现最终功能是根据所给十六进制字符串计算其校验和并转为十六进制字符添加到原有字符串上.