gpt4 book ai didi

javascript - 了解大端与字符串之间的相互转换

转载 作者:行者123 更新时间:2023-11-30 14:50:37 25 4
gpt4 key购买 nike

看着这些实现,我想知道是否有人可以解释具体操作背后的原因。不是来自计算机科学,我不确定为什么做出这些决定。

function binb2rstr(input) {
var str = []
for (var i = 0, n = input.length * 32; i < n; i += 8) {
var code = (input[i >> 5] >>> (24 - i % 32)) & 0xFF
var val = String.fromCharCode(code)
str.push(val)
}
return str.join('')
}

function rstr2binb(input) {
var output = Array(input.length >> 2)

for (var i = 0, n = output.length; i < n; i++) {
output[i] = 0
}

for (var i = 0, n = input.length * 8; i < n; i += 8) {
output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32)
}

return output
}

目前我的理解是:

  1. i += 8用于遍历字节。
  2. 0xFF是255,即2^8 - 1 , 所以 1 个字节。
  3. 32 是一个word 的大小,即 4 个字节
  4. |是按位或,<< , >>> , 和 &同样是位运算符。
  5. %模数将值保持在 x = x % max 的最大值内.

我不明白的是:

  1. i >> 5 , 是如何挑选出来的。
  2. & 0xFF , 是如何挑选出来的。
  3. 24 - i % 32 ,24 的来源。
  4. var code = (input[i >> 5] >>> (24 - i % 32)) & 0xFF ,字符代码是如何从中计算出来的。
  5. input.length >> 2

想知道这是否只是一个标准的计算机科学函数,因为很难说出这些变量来自何处以及如何学习。这些值似乎必须是基于字节长度的标准算法,但我不知道如何解决这些开放性问题。感谢您的帮助。

最佳答案

此代码包含一些基于 32 位值的非常聪明的位操作。
但是,让我们继续讨论您的观点:

  1. i >> 5, how that was picked.

这会将 i 除以 32 --- 对应于 n = input.length * 32 总长度。考虑到整个算法,这意味着在选择下一个 input 值之前,一个值被处理四次 (0,8,16,24)

  1. & 0xFF, how that was picked.

这只是选择 n 位值的最低 8 位。

  1. 24 - i % 32, where the 24 came from.

这与 i += 8 有关。 i % 32 表示四个不同的迭代 (32/8=4),它们是 temp= (0, 8, 16, 24)。所以 24-temp 结果为 (24,16,8,0)

  1. var code = (input[i >> 5] >>> (24 - i % 32)) & 0xFF, how the character code is computed from that.
1. 1st iteration: i=0 ;24-0=24; input[0] >>> 24 & 0xFF =     highest byte of input[0] shifted to lowest
2. 2nd iteration: i=8 ;24-8=16; input[0] >>> 16 & 0xFF = 2nd highest byte of input[0] shifted to 2nd lowest
3. 3rd iteration: i=16;24-16=8; input[0] >>> 8 & 0xFF = 2nd lowest byte of input[0] shifted to 2nd highest
4. 4th iteration: i=8 ;24-24=0; input[0] >>> 0 & 0xFF = lowest byte of input[0] shifted to highest

这就是大端转换。
下一次迭代有i=32,开始下一次迭代input[32/32]=input[1]

总体而言,该算法将 32 位代码向右移动并屏蔽最低 8 位以供 String.fromCharCode(code) 用作 CharCode。

最后一个来自不同的算法,因此 input.length >> 2 只是执行 除以 2 并丢弃 1 的可能其余部分。


关于你的最后一个问题:

It seems like these values must be a standard algorithm based on byte length but I can't tell how to get there with these open questions.

这远非标准算法。这只是一个聪明的位操作基于字节

在汇编程序中,这段代码会更容易理解。
甚至有一条指令叫做 BSWAP在寄存器中的 32 位 Big-Endian 和 Little-Endian 值之间交换。

关于javascript - 了解大端与字符串之间的相互转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48161461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com