【发布时间】:2016-11-30 08:13:21
【问题描述】:
如何在 Swift 中编写以下 C 代码?
glyphIndex = *(&idRangeOffset[i] + idRangeOffset[i] / 2 + (c - startCode[i]))
我正在尝试使用一个简单的小型二进制数据读取器来读取 Format 4 TrueType 字符映射表。在涉及指针操作之前,一切都很好,因为在 C 中工作时我几乎无法做出指针的正面或反面,更不用说那些伪装成带有Unsafe 前缀的指针了。
我尝试了多种方法,但似乎都没有什么效果。我想我只是不确定如何在 Swift 中使用指针“地址”。
例如,这里有一个关于我在哪里的更完整的想法:
// The following variables are all [UInt16]:
// - startCodes
// - endCodes
// - idDeltas
// - idRangeOffsets
var gids = [Int]()
// Iterate segments, skipping the last character code (0xFFFF)
for i in 0 ..< segCount - 1 {
let start = startCodes[i]
let end = endCodes[i]
let delta = idDeltas[i]
let rangeOffset = idRangeOffsets[i]
let charRange = start ..< (end + 1)
if rangeOffset == 0 {
gids.append(contentsOf: charRange.map { charCode in
return (charCode + delta) & 0xFFFF
})
}
else {
for charCode in charRange {
// ???
}
}
}
在上面的代码中,您会注意到???。这是我使用上面提到的奇怪的 C-pointer-address-pointer-huh 技巧检索字形索引的地方。问题是,我就是想不通。替换我真正理解的变量,这就是我得到的:
for charCode in charRange {
Not too sure about this Actual value of idRangeOffset[i]
| |
v v
glyphIndex = *(&idRangeOffset[i] + rangeOffset / 2 + (charCode - start))
^
|
Or this
}
是否有任何 Swift 3 指针大师可以带领我走上启蒙之路?任何帮助将不胜感激!
【问题讨论】:
-
对于您创建
glyphIndex的代码,外括号内的部分会创建一个指针。这些括号前面的*然后获取该指针指向的数据 -
外括号内的第一位,
&idRangeOffset[i]获取idRangeOffset[i]中值的地址。在 C 中,这是一个指针,即一个保存另一个对象地址的变量。第二部分,+ rangeOffset / 2 + (charCode - start),然后向 address 添加更多值,以便它现在指向其他地方。 -
这应该如何在swift中正确表示我不知道我害怕
-
@Toby 那么,例如,假设
int idRangeOffset[] = {10, 20, 30, 40, 50},idRangeOffset[2]中的“地址”实际上是指针的地址(而不是数组中的索引2)吗?如果是这样,“地址”究竟是什么?我们是在谈论二进制数据中的偏移量,还是什么?我为所有的问题道歉,指针只是让我头疼。 -
Ben,
idRangeOffset[2]不会产生 n 地址,但&idRangeOffset[2]会。它将给出该数组中第二项的地址(内存中的位置)。
标签: c swift pointers character-encoding truetype