- (void)pushDigitalJoin: (NSString*)joinNumber
{
char joinByteArray[] = {
0x05, 0x00, 0x06, 0x00, 0x00, 0x03, 0x27
};
int joinIntNumber = ([joinNumber intValue] - 1);
char *upperByte;
char *lowerByte;
NSString *decimalString = [NSString stringWithFormat:@"%i", 0xff];
*upperByte = joinIntNumber & [decimalString intValue];
*lowerByte = joinIntNumber >> 8;
joinByteArray[7]= *upperByte;
joinByteArray[8] = *lowerByte;
int i;
for (i = 0; i < sizeof(joinByteArray); i++) {
NSLog(@"joinByteArray: position-%i | value-%i",i,joinByteArray[i]);
}
}
基本上我有字节数组
我需要根据“ joinNumber”更改最后2个字节
然后将这两个字节添加到数组中
但是我在joinIntNumber >> 8上遇到编译错误,并且上面使用and运算符的操作似乎不起作用。 (输出始终显示39)
那么我如何正确使用这些按位运算符并将2bytes添加到数组中呢?
做出更改以反映评论和显示输出(答案(:
- (void)pushDigitalJoin: (NSString*)joinNumber
{
char joinByteArray[] = {
0x05, 0x00, 0x06, 0x00, 0x00, 0x03, 0x27, 0x00, 0x00
};
int joinIntNumber = ([joinNumber intValue] - 1);
char upperByte = nil;
char lowerByte = nil;
// NSString *decimalString = [NSString stringWithFormat:@"%i", 0xff];
upperByte = joinIntNumber & 0xff;//[decimalString intValue];
lowerByte = joinIntNumber >> 8;
joinByteArray[7]= upperByte;
joinByteArray[8] = lowerByte;
int i;
for (i = 0; i < sizeof(joinByteArray); i++) {
NSLog(@"joinByteArray: position-%i | value-%x",i,joinByteArray[i]);
}
}
输出(joinnumber = 5):
2011-08-26 11:06:07.554 Cameleon [2213:40b] joinByteArray:位置0 |价值5
2011-08-26 11:06:07.555 Cameleon [2213:40b] joinByteArray:位置1 |值-0
2011-08-26 11:06:07.557 Cameleon [2213:40b] joinByteArray:位置2 |值6
2011-08-26 11:06:07.558 Cameleon [2213:40b] joinByteArray:位置3 |值-0
2011-08-26 11:06:07.559 Cameleon [2213:40b] joinByteArray:位置4 |值-0
2011-08-26 11:06:07.561 Cameleon [2213:40b] joinByteArray:位置5 |价值3
2011-08-26 11:06:07.562 Cameleon [2213:40b] joinByteArray:位置6 |值27
2011-08-26 11:06:07.563 Cameleon [2213:40b] joinByteArray:位置7 |价值4
2011-08-26 11:06:07.564 Cameleon [2213:40b] joinByteArray:位置8 |值-0
最佳答案
那么我如何正确使用这些按位运算符并将2bytes添加到数组中呢?
你不知道该数组在堆栈上声明,并且具有固定大小(7个字节)。如果尝试将值添加到末尾,则可能会踩踏堆栈上的其他值,并可能损坏堆栈。
不相关,但也有问题的是:
NSString *decimalString = [NSString stringWithFormat:@"%i", 0xff];
*upperByte = joinIntNumber & [decimalString intValue];
那真的没有任何意义...为什么您要从一个int创建一个字符串以仅接受它的intValue?最好写:
*upperByte = joinIntNumber & 0xff;
还有另一件事……您将upperByte和lowerByte声明为字符指针(char *),但没有将它们设置为指向任何特定的东西。因此,当您尝试如上一行那样设置它们指向的字符时,最终将把这些值放到随机位置。
如果需要一个可以修改的C数组,则应声明一个足够大的数组以容纳要添加的任何值,在这种情况下:
char joinByteArray[] = {
0x05, 0x00, 0x06, 0x00, 0x00, 0x03, 0x27, 0x00, 0x00
};
您也可以使用malloc()和朋友在堆上创建它,但是再次需要一开始就使其足够大以容纳您的额外值,或者在添加新值之前使用realloc()增大数组。价值观。无论如何,不要写到数组末尾。
关于objective-c - 按位运算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7207114/