ios - 代码片段缺乏理解

标签 ios objective-c

我正在使用需要转换的 C 代码片段进行拳击。 其中一个功能如下:

+(float) calcTemp:(NSData *)data {
    char scratchVal[data.length];
    [data getBytes:&scratchVal length:data.length];
    UInt16 temp;
    temp = (scratchVal[0] & 0xff) | ((scratchVal[1] << 8) & 0xff00);
    return (float)temp;
}

我似乎无法理解这一行:

temp = (scratchVal[0] & 0xff) | ((scratchVal[1] << 8) & 0xff00);

我知道这可能是一个新问题(但我是菜鸟^),如果有人可以向我解释这句话,我将不胜感激。特别是带有地址引用和运算符(operator)使用的东西。

在代码片段中,我不明白为什么他们对数据调用 getBytes:length 方法,因为它没有被使用。但主要是,我只是想理解我指出的那句话。

最佳答案

线

temp = (scratchVal[0] & 0xff) | ((scratchVal[1] << 8) & 0xff00);

正在从源自 scratchVal 的两个字节创建一个无符号的 16 位整数值.单&在此上下文中不是地址运算符而是按位与。所以temp的低字节从 scratchVal 中包含的第一个字节开始设置, 和 temp 的高字节通过左移 scratchVal 中包含的第二个字节来设置.使用按位或 | 将两个结果数字连接在一起.为避免符号扩展或其他不需要的位,掩码 0xff0xff00用于确保所有不良品为零。

可视化呈现,如果 scratchVal包含位 aaaaaaaa bbbbbbbb在前两个字节中,temp 将以位模式 bbbbbbbbaaaaaaaa 的无符号整数结束。 .

第二个问题问他们为什么调用 -getBytes:length: .线路

[data getBytes:&scratchVal length:data.length];

data读取字节进入scratchVal临时缓冲区。

回复评论中的问题

why it is needed to left shift the bits to concatenate them

简单的赋值是行不通的。再次假设 scratchValchar包含位 aaaaaaaa bbbbbbbb 的缓冲区, 代码

temp = scratchVal[0];

将使温度等于UInt16相当于位 aaaaaaaa .您不能使用加法,因为结果将是将两个字节加在一起的任何值 ( aaaaaaaa + bbbbbbbb )。

以实数为例,假设scratchVal的前两个字节等于0x7f 0x7f .

temp = scratchVal[0] + scratchVal[1];

原来是0x7f + 0x7f = 0xfe这不是这段代码的目的。

通过将其分解为多个步骤可以更好地理解使用 OR 构建值(value)。

表达式的第一部分是scratchVal[0] & 0xff = 0x7f & 0xff = 0x7f

第二部分是(scratchVal[1] << 8) & 0xff00 = (0x7f << 8) & 0xff = 0x7f00 & 0xff = 0x7f00

这种情况下的最终结果是0x7f | 0x7f00 = 0x7f7f .

关于ios - 代码片段缺乏理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28067525/

相关文章:

ios - 有没有办法在 UIKeyboardType.NumberPad 的左下角区域添加一个字母?

iphone - 如何从 UIbutton 选择器调用方法?

objective-c - Mac OS X Timing 应用程序如何跟踪文件

ios - 是否可以在 iOS 中使用 "adtapsy"显示横幅广告?

iphone - XCode 的内存泄漏仪器时间线中的歧义

ios - 翻转和旋转

ios - 折叠 展开 UITableView

ios - 如何重命名 AVPlayer 中的完成按钮?

objective-c - xCode 4导入框架不起作用

objective-c - 如何使用带有 RestKit 的 postObject 自定义 json 发送?