0

16進値を2進値に変換しようとしていますが、ほとんど問題に直面していません。私は自分の欠点を学ぼうとしているのは初めてです。

私のコード:

NSMutableString *str;
NSString *dd = @"192:168:1:2:0B:2:D:00";    
NSCharacterSet *donotwant1 = [NSCharacterSet characterSetWithCharactersInString:@":""];
dd =[[dd componentsSeparatedByCharactersInSet:donotwant1] componentsJoinedByString:@" "];
NSMutableArray *array = [[dd componentsSeparatedByString:@" "] mutableCopy];

[array removeObjectAtIndex:0];
//NSLog(@"%@",array);

for (int j=0; j<[array count]; j++) {
    NSScanner *scan = [NSScanner scannerWithString:[array objectAtIndex:j]];
    unsigned int i=0;

    if ([scan scanHexInt:&i]) {
        // NSLog(@"numbner is %ustr", i);
    }

    NSInteger theNumber = i;
    str = [NSMutableString string];
    for(NSInteger numberCopy = theNumber; numberCopy > 0; numberCopy >>= 1) {
        // Prepend "0" or "1", depending on the bit
        [str insertString:((numberCopy & 1) ? @"1" : @"0") atIndex:0];

        [array removeObjectAtIndex:j];
        [array  insertObject:str atIndex:j];
    }
}

NSLog(@"Binary version: %@", array);

私は得ています

1,1100,11001111,1111,1111,11101111....。

私のコードでは、0の値が削除されています。(00000001,00001100 .....)のような8ビットが欲しいのですが、理由を教えてもらえますか

4

1 に答える 1

2

最上位ビットに達すると、アルゴリズムは変換を停止します。ループを常に 8 回実行するように強制しないのはなぜですか?

for (int numberCopy = theNumber, int i = 0; i < 8; numberCopy >>= 1, i++) {
    // loop body here
}

ところで、これは非常に余分なコピーを必要とせず、超効率のために文字列オブジェクトの代わりに文字を使用する、よりクリーン/より短く/より単純なアプローチです (冗談です、私はすべてマイクロ最適化に反対ですが、NSString前に挿入したい気がします特にビット数が既知で一定である場合は、もう 1 つ必要ありません)。これもUTF-8 を想定しており、16 は 2 の 4 乗であり、16 進数と 2 進数の表現には非常に良い関係があるという事実を利用しています。

NSString *dd = @"01:0C:CF:0F:EF:AF:BD:00";

NSArray *bytes = [dd componentsSeparatedByString:@":"];

NSMutableArray *binaries = [NSMutableArray array];

NSString *lookup[256];
lookup['0'] = @"0000";
lookup['1'] = @"0001";
lookup['2'] = @"0010";
lookup['3'] = @"0011";
lookup['4'] = @"0100";
lookup['5'] = @"0101";
lookup['6'] = @"0110";
lookup['7'] = @"0111";
lookup['8'] = @"1000";
lookup['9'] = @"1001";
lookup['A'] = @"1010";
lookup['B'] = @"1011";
lookup['C'] = @"1100";
lookup['D'] = @"1101";
lookup['E'] = @"1110";
lookup['F'] = @"1111";


for (NSString *s in bytes) {
    unichar n1 = [s characterAtIndex:0];
    unichar n0 = [s characterAtIndex:1];
    [binaries addObject:[lookup[n1] stringByAppendingString:lookup[n0]]];
}

NSLog(@"%@", binaries);
于 2013-03-06T20:26:03.713 に答える