-1

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

我曾计划使用整数,但后来我突然想到,我真正需要的只是一个比特流。

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

给定一系列 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
4

2 回答 2

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];
}
于 2013-11-14T21:25:13.653 回答
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 个字符块并将它们转换为长整数。

于 2015-06-18T16:30:11.730 回答