如何在Objective-C中将BOOL转换为字节?

时间:2013-02-24 17:09:22

标签: objective-c xcode networking nsdata

我有一系列数据最终可以表示为BOOLs。我想将这些BOOLs转换为bytes,以便将它们放在NSData对象中并通过网络发送。我知道我可以将8 BOOLs放入1 byte。我该如何打包这些数据?此外,一旦收到,我将如何将其打包回BOOLs?网络部分正在通过GameCenter处理,因此我只需要担心打包和解包数据。

3 个答案:

答案 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