0

在 Safari 中执行此 JavaScript 代码

// expected output - array containing 32 bit words
b = "a";
    var a = Array((b.length+3) >> 2);
for (var i = 0; i < b.length; i++) a[i>>2] |= (b.charCodeAt(i) << (24-(i & 3)*8));

和 iOS 模拟器中的这个 (Objective-)C 代码

    int array[((@"a".length + 3) >> 2)];

for (int i = 0; i < @"a".length; i++) {
    int c = (int) [@"a" characterAtIndex:i];
    array[i>>2] |= (c << (24-((i & 3)*8)));

}

给我不同的输出 - 连续(JavaScript)1627389952和(Objective-C)1627748484。

由于前四位数字始终相同,我认为错误与精度有关,但我无法发现问题。

编辑

很抱歉缺乏关注,非常感谢你们(@Joni 和你们所有人)。你说得对,C 代码中的数组充满了一些随机值。我解决了将数组中的所有元素设置为零的问题:

memset(array, 0, sizeof(array));

如果有人好奇,C 代码现在看起来像这样:

int array[((@"a".length + 3) >> 2)];

memset(array, 0, sizeof(array));

for (int i = 0; i < @"a".length; i++) {
    int c = (int) [@"a" characterAtIndex:i];
    array[i>>2] |= (c << (24-((i & 3)*8)));

}
4

2 回答 2

2

我不知道 Objective-c 是如何初始化数组的,但是在 javascript 中它们没有被初始化为任何东西(事实上,索引甚至不存在),所以至少要注意这一点:

var b = "a";
var a = Array((b.length + 3) >> 2);
for( var i = 0, len = a.length; i < len; ++i ) {
    a[i] = 0; //initialize a values to 0
}
for (var i = 0; i < b.length; i++) {
    a[i >> 2] |= (b.charCodeAt(i) << (24 - (i & 3) * 8));
}

其次,这实际上应该计算97 << 24,正确答案是1627389952,因此 Objective-C 结果是错误的。可能是因为数组值未初始化为 0?

于 2013-07-06T14:00:23.463 回答
1

您没有在目标 c 中将数组设置为零,因此它可能有一些随机垃圾开始。

于 2013-07-06T14:02:05.203 回答