如何设置字节中的位?

时间:2013-11-14 21:21:50

标签: objective-c nsdata

我需要存储一系列任意长度的1和0。

我原本计划使用整数,但后来我发现我真正需要的只是一个比特流。

NSMutableData似乎就是这样。除了所有我看到有人在谈论的是如何在其上设置字节,或在其中存储jpegs或字符串。我需要比这更精细。

给定一系列1和0,例如:110010101011110110,如何将其作为NSData对象 - 我该如何解决?

NSData的appendBytes:length:和mutableBytes都在字节级别,我需要从低位开始。当字节本身由1和0的集合组成时,将那些1和0存储为字节是没有意义的。我找不到任何告诉我如何设置位的麻烦。

这是一些虚假代码:

NSString *sequence = @"01001010000010"; //(or int sequence, or whatever)
for (...){//iterate through whatever it is--this isn't what I need help with
     if ([sequence intOrCharOrWhateverAtIndex: index] == 0) {
          //do something to set a bit -- this is what I need help with
     } else {
          //set the bit the other way -- again, this is what I need help with 
     }
}
NSData *data = [NSData something]; //wrap it up and save it -- help here too

2 个答案:

答案 0 :(得分:5)

你真的有1和0吗?喜欢...... ASCII数字?我会使用NSString来存储它。如果用1和0表示一堆比特,那么只需将比特数除以8即可获得字节数并生成字节的NSData。

(编辑添加未经测试的代码以将比特流转换为缓冲区)

//Assuming the presence of an array of 1s and 0s stored as some numeric type, called bits, and the number of bits in the array stored in a variable called bitsLength
NSMutableData *buffer = [NSMutableData data];
for (int i = 0; i < bitsLength; i += 8) {
    char byte = 0;
    for (int bit = 0; bit < 8 && i + bit < bitsLength; bit++) {
        if (bits[i + bit] > 0) {
            byte += (1 << bit);
        }
    }
    [buffer appendBytes:&byte length:1];
}

答案 1 :(得分:0)

我从Convert Binary to Decimal in Objective C

得到了这个答案

基本上,我认为问题可能是措辞,“我如何将二进制数字的字符串表示解析为原始数字类型”。魔术全都在strtol。

  NSString* b = @"01001010000010";  
  long v = strtol([b UTF8String], NULL, 2);
  long data[1];
  data[0] = v;
  NSData* d = [NSData dataWithBytes:data length:sizeof(data)];
  [d writeToFile:@"test.txt" atomically:YES];

使用这个想法,你可以将你的字符串拆分成64个字符的块并将它们转换为long。