【问题标题】:What does charCodeAt(...) & 0xff accomplish?charCodeAt(...) & 0xff 完成了什么?
【发布时间】:2013-12-23 19:29:07
【问题描述】:

我不确定 0xFF 在这里做什么... 是否只是为了确保二进制代码是 8 位长或与有符号/无符号编码有关?太棒了。

var nBytes = data.length, ui8Data = new Uint8Array(nBytes);

for (var nIdx = 0; nIdx < nBytes; nIdx++) {
  ui8Data[nIdx] = data.charCodeAt(nIdx) & 0xff;
}

XHR.send(ui8Data);

【问题讨论】:

  • 0xFF 是 255 的十六进制。它用 255 掩盖 charCodeAt(nIdx) 作为“选择”低 8 位的一种方式。
  • 这个问题比标题所暗示的要多。 “重复”问题与位掩码无关。
  • 这可能是这个问题的重复,不过:stackoverflow.com/questions/20486551/…
  • @ScottMermelstein 如果还有更多内容,请通过编辑标题来帮助我们准确了解 OP 的要求?基于问题中的所有可用文本;这些问题似乎是重复的。如果不是,最好的办法是编辑问题以显示这些差异,以便可以重新打开它,并且可以回答他真正想要回答的问题。
  • @GeorgeStocker 真的吗?你看不出“0X 是什么意思?我在课堂上看到它”和有人使用“& 0xff”发布代码询问它的作用之间有什么区别?等一下,我会修改标题。

标签: javascript


【解决方案1】:

您的第一个猜测是正确的。它只占用data.charCodeAt 返回的内容的最低有效 8 位。

charCodeAt 将返回 0..65536 范围内的值。此代码将该范围截断为 0..255。实际上,它取字符串中的每个 16 位字符,假设它可以放入 8 位,然后丢弃高字节。

[6 年后编辑] 在 cmets 中,我们发现了一些事情:您在质疑 the MDN polyfill for sendAsBinary 的代码。正如您所了解的,最低有效字节确实在小端系统中排在第一位,而最高有效字节在大端系统中排在第一位。 鉴于这是来自 MDN 的代码,该代码确实符合预期 - 通过使用 FileReader.readAsBinaryString,它将 8 位值存储到 16 位持有者中。如果您担心数据丢失,您可以调整 polyfill 以使用 sData.charCodeAt(nIdx) &amp;&amp; 0xff00 &gt;&gt; 8 提取另一个字节。

【讨论】:

  • 好的..我真的不明白这里..如果数据包含来自文件的数据,所以我不知道字符会是什么样子,他会保留哪一部分? -- 如果数据看起来像 01010101 11110000 -- 当与 255 进行 AND 运算时会剩下什么?也许我不明白最低有效位是什么..
  • @Ray 是 easy enough 来测试这个问题。如果您的字节是 0x99f0,0x99f0 &amp; 0x00ff(与0x99f0 &amp; 0xff 相同)给出 0xf0。如果您正在阅读文件,我认为您必须自己处理文件的字节顺序。如果你知道它是小端,你必须自己手动解释它,0x99f0 &amp; 0xff00 &gt;&gt; 8。检查我链接到的问题,以找到确认 unicode 值在适当范围内的好方法。
  • 好的..我想我明白了.. 字节序是我不理解的东西.. 最低有效字节在小字节序中首先出现在内存中.. 这是 sendAsBinary 函数,如果我理解的话是的,如果 char 占用超过一个字节,它将无法在大端系统中工作.. ty 非常..
  • @Ray 哇。如果您在问题中提及the MDN polyfill for sendAsBinary,那将会有很大帮助。两件快速的事情 - 他们小心使用FileReader.readAsBinaryString,所以除非 MDN 搞砸了,否则可能没问题 - 它将 8 位值读入 16 位持有者。此外,如果您担心数据丢失,您可以使用 sData.charCodeAt(nIdx) &amp;&amp; 0xff00 &gt;&gt; 8 调整 polyfill 以提取另一个字节
  • @ScottMermelstein 这是一个老问题/答案(事实上,我不知道我是怎么在这里绊倒的),但最后两个 cmets(Ray 的澄清和你对 sendAsBinary 的扩展)似乎值得纳入进入你的答案。
猜你喜欢
  • 2013-08-27
  • 1970-01-01
  • 2021-10-13
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
  • 2014-09-08
  • 1970-01-01
相关资源
最近更新 更多