【问题标题】:Decode 5-digit binary string back into character将 5 位二进制字符串解码回字符
【发布时间】:2018-06-17 15:08:04
【问题描述】:

我创建了一个简单的函数,它能够将每个字母字符 (a-z) 转换为 always 5-digit binary string (like "00000->a" or "11000->y")

SWIFT

 let alphabeth_array=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "", "", "", "", "", ""]
 for i in 0..<32 {
   let binary_code = String(i/16%2) + String(i/8%2) + String(i/4%2) + String(i/2%2) + String(i%2)
   print("\(alphabeth_array[i]) : \(binary_code)")
}



JAVASCRIPT

 var alphabeth_array=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "", "", "", "", "", ""]
 for (var i=0; i<32; i++) {
   var binary_code = (i/16%2).toString() + (i/8%2).toString() + (i/4%2).toString() + (i/2%2).toString() + (i%2).toString()
   console.log(alphabeth_array[i] + " : " + binary_code)
}



但是现在我想将二进制字符串解码回它们从上面的alphabeth_array 连接的字符。

SWIFT

let binary = "00000" //starting with the binary string
let character = getChar(binaryCode: binary)

func getChar(binaryCode: String) -> (String) {
   // programm logic
   return result
}



JAVASCRIPT

var binary = "00000" //starting with the binary string
var character = getChar(binary)


function getChar(binary) {
   // programm logic
   return result
}

我完全不知道如何反转解码函数以将二进制字符串转换回连接字符。任何帮助将不胜感激,谢谢! (我宁愿只获得一些小代码 sn-ps、Swift 或 javascript - 哪种语言无关紧要 !)

【问题讨论】:

  • 亲爱的老兄,按了不喜欢的按钮!您能好心告诉我们有什么可以改进的地方吗?
  • 如果你更喜欢获得 js 结果,我会省略 swift 部分...
  • 哪个答案最好? JS 还是 SWIFT??
  • 然后我仍然会问两个问题,每种语言一个。 “最佳”答案通常是最快、最短或解释最好的。现在你怎么能决定呢?
  • 我很好奇,这种奇怪的文本编码你的用例是什么?

标签: javascript swift string binary


【解决方案1】:

您可以使用init?&lt;S&gt;(_ text: S, radix: Int = default) where S : StringProtocol 初始化程序将二进制字符串转换为整数,并将其用作访问字母数组元素的索引。您也可以使用String(_ value:, radix:, uppercase:) 将数组索引转换为二进制的初始化程序:

let alphabeth = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
var bins: [String] = []
for index in alphabeth.indices {
    let binary = String(index, radix: 2)
    let zeros = repeatElement("0", count: 5 - binary.count).joined()
    bins.append("\(zeros)\(binary)")
    print(alphabeth[index], bins.last!)
}
for binary in bins {
    if let index = Int(binary, radix: 2) {
        print(alphabeth[index])
    }   
}

【讨论】:

【解决方案2】:

您可以使用基数2 解析字符串,添加10 的偏移量并将值转换为基数36 的值。

function getCharacter(string) {
    return (parseInt(string, 2) + 10).toString(36);
}

function getBinary(string) {
    return ('000000' + (parseInt(string, 36) - 10).toString(2)).slice(-5);
}

console.log(getCharacter('00000')); // a
console.log(getCharacter('11000')); // y
console.log(getBinary('a'));        // 00000
console.log(getBinary('y'));        // 11000

【讨论】:

    【解决方案3】:

    正如 Leo 在his answer 的第一句话中所说,可以将二进制字符串转换为 Swift 中的字符,如下所示:

    let alphabetArray=["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "", "", "", "", "", ""]
    let string = "00010"
    let c = alphabetArray[Int(string, radix: 2)!]
    

    或者你可以完全绕过alphabetArray

    let c = Character(Unicode.Scalar(Int(string, radix: 2)! + 97)!)
    

    【讨论】:

    • 我想知道为什么这个答案与我在获得两票后发布的完全一样
    • 你描述了他能做什么,但你有点埋没了领先优势。 (我必须承认,直到我重新阅读您的答案,我才意识到我的答案已被您答案第一句话的叙述所暗示。)我只是展示了两个非常简单的例子来说明如何做到这一点。如果它真的困扰您,请随时编辑您的答案以显示您的第一种方法的示例,如果您真的想要,我可以删除它。我不是想抢你的风头,只是为了展示如何做到这一点的简单实用的例子。
    • @Rob 别担心
    • @LeoDabus - 大声笑,现在我为澄清你的答案而投了反对票。
    • @Rob 我已经习惯了。我只是在 SO 上继续回答,以便与像你这样的人互动。
    【解决方案4】:
     const getChar = num => alphabeth_array[parseInt(num, 2)];
    

    【讨论】:

    • @jonas0000 是的。这就是函数的作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 2013-01-12
    • 1970-01-01
    相关资源
    最近更新 更多