我需要存储一系列任意长度的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
答案 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。