我有一系列数据最终可以表示为BOOLs
。我想将这些BOOLs
转换为bytes
,以便将它们放在NSData
对象中并通过网络发送。我知道我可以将8 BOOLs
放入1 byte
。我该如何打包这些数据?此外,一旦收到,我将如何将其打包回BOOLs
?网络部分正在通过GameCenter
处理,因此我只需要担心打包和解包数据。
答案 0 :(得分:3)
首先:你真的想要或需要将8个bool打包成一个字节吗?打包可以节省带宽但增加了很多复杂性和麻烦;多年来,它一直是臭虫的有力来源。
如果您确实想这样做,请使用掩码和逻辑运算符。
#define kMill 1
#define kDrill 2
#define kFill 4
#define kALL kMill|kDrill|kFill;
unsigned char TheData;
- (BOOL) isMilled { return (theData&kMill)!=0; }
- (void) setMilled: (BOOL) flag {
if (flag) {theData |= kMill;}
else {theData = theData & (kAll^kMill;}}
C工会对此有一些支持,但最好避免使用该功能。
通常,避免过早优化。简单地表示您的数据,然后在出现性能问题时查看线路上的压缩表示。
答案 1 :(得分:3)
您可以将数据视为位的集合,并使用
CFBitVector
及其可变副本CFMutableBitVector
,是用于管理位值集合的CoreFoundation类型,或者在较低级别上
两种方法都提供函数/宏来设置大位向量中的各个位,并且可以访问底层缓冲区以将位向量包装到NSData
对象中并返回。
CFBitVector
的示例:
// Create a bit vector and set some bits:
CFIndex numBits = 256;
CFMutableBitVectorRef bitvec = CFBitVectorCreateMutable(NULL, 0);
CFBitVectorSetCount(bitvec, numBits);
CFBitVectorSetBitAtIndex(bitvec, 0, 1);
CFBitVectorSetBitAtIndex(bitvec, 5, 1);
CFBitVectorSetBitAtIndex(bitvec, 255, 1);
// Pack into NSData:
size_t nbytes = (CFBitVectorGetCount(bitvec) + 7)/8;
NSMutableData *data = [NSMutableData dataWithLength:nbytes];
CFBitVectorGetBits(bitvec, CFRangeMake(0, CFBitVectorGetCount(bitvec)), [data mutableBytes]);
// And back to CFBitVector:
CFBitVectorRef bitvec2 = CFBitVectorCreate(NULL, [data bytes], [data length] * 8);
// Test a value:
BOOL bit5set = CFBitVectorGetBitAtIndex(bitvec2, 5) != 0;
位字符串示例:
// Create bit-string and set some bits:
int numBits = 1024;
bitstr_t *mybits = bit_alloc(numBits);
bit_nclear(mybits, 0, numBits - 1);
bit_set(mybits, 5);
bit_set(mybits, 17);
// Pack into NSData:
NSData *data = [NSData dataWithBytes:mybits length:bitstr_size(numBits)*sizeof(bitstr_t)];
// And back to bit-string:
int bitcount = (int)[data length] * 8;
const bitstr_t *mybits2 = [data bytes];
// Test a value:
BOOL bit5set = bit_test(mybits2, 5) != 0;
答案 2 :(得分:1)
不能将8个BOOLS作为BOOL放入1个字节!=布尔值(1/0 = 1位) BOOL是一个简短的,只有99%的情况是1/0
说,如果你假设只有1/0位将东西移到一个字节!
UInt8 b = 0;
BOOL bool1 = YES, bool2 = NO, bool3 = YES;
if(bool1) b = b | 1;
if(bool2) b = b | 2;
if(bool3) b = b | 4;
// insert code here...
NSLog(@"%@", [NSData dataWithBytes:&b length:1]);
bool1 = b & 1;
bool2 = b & 2;
bool3 = b & 4;
NSLog(@"%d%d%d", bool1, bool2, bool3);
但这不值得:D