【问题标题】:Buffer Use Explanation缓冲区使用说明
【发布时间】:2017-02-25 19:09:44
【问题描述】:

我在代码战中发现了这个巧妙的凯撒密码解决方案。我试图了解缓冲区在这里做了什么。

b=Buffer
caesarian = (m, n) =>
  "" + b([...b(m)].map(x => (n % 26 + x + 7) % 26 + 97))

空字符串可以与这样的类型化数组连接吗?

【问题讨论】:

  • 字符串?类型化数组?你在哪里看到这些?请展示一个示例调用以及你不理解的地方,或者你如何在没有缓冲区的情况下编写它。
  • Buffer 构造函数不创建类型化数组吗?我没有写这个。我遇到了它,我正在努力理解它。
  • 这是一个 Node.js Buffer,对吧?您应该使用 Node.js 标记。
  • @epiqueras No?

标签: javascript arrays node.js ecmascript-6 caesar-cipher


【解决方案1】:

迭代 Node.js Buffer 一次会产生一个字节的数据。对于包含字母数字字符的Buffer(默认编码为utf8),这与获取每个char的ASCII码相同:

[...Buffer("hello")] // [ 104, 101, 108, 108, 111 ]

(n % 26 + x + 7) % 26 + 97) 是 ASCII 上的凯撒密码算法 - 我想你对这部分很熟悉。

因此,这个块将字符串解释为一个 ASCII 码数组并将它们转换为相应的输出:

[...b(m)].map(x => (n % 26 + x + 7) % 26 + 97))

您可以使用字节值数组初始化Buffer

Buffer([97]) // <Buffer 61>

您可以通过将 JavaScript 中的任何内容与空字符串连接来获得字符串表示形式,因此 "" + b([97])Buffer([97]).toString() 相同。 Buffer#toString 将存储的字节解释为 unicode 字符:

"" + Buffer([97]) // 'a'

因此外层"" + b(/* ... */)的意义在于将被操纵的ASCII码转回字母数字字符进行显示。

【讨论】:

  • 很好的答案,谢谢!您确定可以将任何对象与字符串连接吗? “你好”+ [0, 1, 2, 3]?
  • 是的。那是"Hello0,1,2,3"
猜你喜欢
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 2015-03-26
  • 1970-01-01
相关资源
最近更新 更多