# バイナリビットをHex値に変換する

obj-cでバイナリデータを16進値に変換するにはどうすればよいですか？ 例：

1111 = F,
1110 = E,
0001 = 1,
0011 = 3.

-(NSString*)convertToHex:(NSString*)hexString

{     NSMutableString * convertingString = [[NSMutableString alloc] init];

for (int x = 0; x < ([hexString length]/4); x++) {

int a = 0;
int b = 0;
int c = 0;
int d = 0;

NSString *A = [NSString stringWithFormat:@"%c", [hexString characterAtIndex:(x)]];
NSString *B = [NSString stringWithFormat:@"%c", [hexString characterAtIndex:(x*4+1)]];
NSString *C = [NSString stringWithFormat:@"%c", [hexString characterAtIndex:(x*4+2)]];
NSString *D = [NSString stringWithFormat:@"%c", [hexString characterAtIndex:(x*4+3)]];

if ([A isEqualToString:@"1"]) { a = 8;}

if ([B isEqualToString:@"1"]) { b = 4;}

if ([C isEqualToString:@"1"]) { c = 2;}

if ([D isEqualToString:@"1"]) { d = 1;}

int total = a + b + c + d;

if (total < 10) { [convertingString appendFormat:@"%i",total]; }
else if (total == 10) { [convertingString appendString:@"A"]; }
else if (total == 11) { [convertingString appendString:@"B"]; }
else if (total == 12) { [convertingString appendString:@"C"]; }
else if (total == 13) { [convertingString appendString:@"D"]; }
else if (total == 14) { [convertingString appendString:@"E"]; }
else if (total == 15) { [convertingString appendString:@"F"]; }

}

NSString *convertedHexString = convertingString;
return [convertedHexString autorelease];
[convertingString release];

}

1
この潜在的に重複する質問を確認してください。

この答えをチェックする、それは私のために働く stackoverflow.com/a/21749758/1000906

## 3 答え

#import

int main(int argc, char *argv[]) {
NSAutoreleasePool *p = [[NSAutoreleasePool alloc] init];

NSString *str = @"10010101010011110110110011010111";

char* cstr = [str cStringUsingEncoding: NSASCIIStringEncoding];

NSUInteger len = strlen(cstr);

char* lastChar = cstr + len - 1;
NSUInteger curVal = 1;

NSUInteger result = 0;

while (lastChar >= cstr) {

if (*lastChar == '1')
{
result += curVal;
}
/*
else
{
//Optionally add checks for correct characters here
}
*/

lastChar--;
curVal <<= 1;
}

NSString *resultStr = [NSString stringWithFormat: @"%x", result];

NSLog(@"Result: %@", resultStr);

[p release];
}

それはうまくいくようですが、まだ改善の余地があると確信しています。

1

@interface bin2hex : NSObject
+(NSString *)convertBin:(NSString *)bin;
@end
@implementation bin2hex
+(NSString*)convertBin:(NSString *)bin
{
if ([bin length] > 16) {

NSMutableArray *bins = [NSMutableArray array];
for (int i = 0;i < [bin length]; i += 16) {
}

NSMutableString *ret = [NSMutableString string];
for (NSString *abin in bins) {
[ret appendString:[bin2hex convertBin:abin]];
}

return ret;

} else {
int value = 0;
for (int i = 0; i < [bin length]; i++) {
value += pow(2,i)*[[bin substringWithRange:NSMakeRange([bin length]-1-i, 1)] intValue];
}
return [NSString stringWithFormat:@"%X", value];
}
}

@end

int main (int argc, const char * argv[])
{

@autoreleasepool {

//insert code here...
NSLog(@"0x%@",[bin2hex convertBin:@"10010101010011110110110011010111"]);

}
return 0;
}

10010101010011110110110011010111 0x954F6CD7 の結果が表示され、瞬時に表示されるようです

1

intは16ビットしか扱えないので

システムに応じて32ビットまたは64ビットのいずれかを保持できる長さに切り替えることができます

ありがとう！私はここで質問があります、なぜあなたは最初に16バイナリ文字に "チョップ"し、後で4バイナリ文字で作業しますか？

[NSDictionary dictionaryWithObjects...]

それは限られた数のエントリーであるからです。

"0000" -> 0
...
"1111" -> F
0