为什么我的;“文本到二进制转换器”;不在Ruby中工作

为什么我的;“文本到二进制转换器”;不在Ruby中工作,ruby,binary,converter,Ruby,Binary,Converter,好的,所以我想学习二进制来编写程序,这样我就可以说,“我15岁的时候就可以用二进制编码了。”。我建立了这个程序,但每次它都打印相同的错误值 lowerCaseLetters = { "a" => 01100001, "b" => 01100010, "c" => 01100011, "d" => 01100100, "e" => 01100101, "f" => 01100110, "g" => 01100111, "h" => 01101000,

好的,所以我想学习二进制来编写程序,这样我就可以说,“我15岁的时候就可以用二进制编码了。”。我建立了这个程序,但每次它都打印相同的错误值

lowerCaseLetters = {
"a" => 01100001,
"b" => 01100010,
"c" => 01100011,
"d" => 01100100,
"e" => 01100101,
"f" => 01100110,
"g" => 01100111,
"h" => 01101000,
"i" => 01101001,
"j" => 01101010,
"k" => 01101011,
"l" => 01101100,
"m" => 01101101,
"n" => 01101110,
"o" => 01101111,
"p" => 01110000,
"q" => 01110001,
"r" => 01110010,
"s" => 01110011,
"t" => 01110100,
"u" => 01110101,
"v" => 01110110,
"w" => 01110111,
"x" => 01111000,
"y" => 01111001,
"z" => 01111010
}

puts "Type your message in English please, and \n -I the program will translate it into BINARY!!-"
userMessage = gets.chomp

puts "Your message in English says: \n >#{userMessage}"
lowerCaseLetters.each {
    |letter, number|
    print "#{number},"
}
所以当我运行这个程序时,不管我输入什么,程序都会输出这些值。即使我输入了一个值,或者6个值(这是我迄今为止的最高值…giggity)

以下是来自终端的两个示例。 例1:

Type your message in English please, and 
 -I the program will translate it into BINARY!!-
j
Your message in English says: 
 >j
294913,294920,294921,294976,294977,294984,294985,295424,295425,295432,295433,295488,295489,295496,295497,299008,299009,299016,299017,299072,299073,299080,299081,299520,299521,299528,
例2:

Type your message in English please, and 
 -I the program will translate it into BINARY!!-
jeebs
Your message in English says: 
 >jeebs
294913,294920,294921,294976,294977,294984,294985,295424,295425,295432,295433,295488,295489,295496,295497,299008,299009,299016,299017,299072,299073,299080,299081,299520,299521,299528,

我在哪里以及为什么会有语法错误?谢谢

我建议看一下关于将字符串转换为二进制的教程

Ruby为此内置了函数。 Ruby内置Base64编码器/解码器的额外信息,供您将来参考

您还可以查看这个字符串到二进制的在线转换器来检查您的结果


希望有帮助

0
开头的数字保留用于八进制表示,因此请尝试以下解决方法:

lowerCaseLetters = { "a" => '01100001', "b" => '01100010',
  "c" => '01100011', "d" => '01100100', "e" => '01100101',
  "f" => '01100110', "g" => '01100111', "h" => '01101000',
  "i" => '01101001', "j" => '01101010', "k" => '01101011',
  "l" => '01101100', "m" => '01101101', "n" => '01101110',
  "o" => '01101111', "p" => '01110000', "q" => '01110001',
  "r" => '01110010', "s" => '01110011', "t" => '01110100',
  "u" => '01110101', "v" => '01110110', "w" => '01110111',
  "x" => '01111000', "y" => '01111001', "z" => '01111010'
}

puts "Type your message in English please,"
puts "and I the program will translate it into BINARY!!-"

userMessage = gets.chomp.split('')

puts "Your message in English says: "
userMessage.each {|letter| print lowerCaseLetters[letter] + " " }
puts
因此,输入
'ab'
返回:
01100001 01100010

我在哪里以及为什么会有语法错误

好消息是你没有。坏消息是您确实有逻辑错误,而且它们更难调试

如何调试Ruby 最简单的方法是IRB,这是一个可以让您交互执行Ruby表达式的工具(称为a)。您可以通过在终端窗口中键入
irb
来启动它:

$ irb
irb(main):001:0>
输入Ruby表达式,IRB将显示其结果:

irb(main):001:0> 1 + 2
#=> 3
irb(main):002:0>
二进制数 现在,让我们检查一个二进制数:

irb(main):002:0> 01100001
#=> 294913
同样奇怪的输出。发生什么事了

Ruby允许您使用一个特殊的前缀以不同的格式写数字。的文档提供了一些见解:

您可以使用特殊前缀以十进制、十六进制、八进制或二进制格式写入数字。对于十进制数,使用前缀
0d
;对于十六进制数,使用前缀
0x
;对于八进制数,使用前缀
0
0o
;对于二进制数,使用前缀
0b

您的数字以
0
开头,因此
0110001
被解释为八进制数字:

11000018
= 1×86+ 1×85+ 0×84+ 0×83+ 0×82+ 0×81+ 1×80
= 262,144 + 32,768 + 0 + 0 + 0 + 0 + 1
=294913

要输入二进制数,您必须使用
0b
前缀:(我正在将该数字分配给一个名为
number
的变量,以便稍后我们可以参考它)

01100012
= 0×27+ 1×26+ 1×25+ 0×24+ 0×23+ 0×22+ 0×21+ 1×20
= 0 + 64 + 32 + 0 + 0 + 0 + 0 + 1
=97

格式化数字 但是为什么Ruby输出的是
97
,而不是
0110001
?这是因为在打印对象时,Ruby调用对象的
to_s
方法。我们的号码是一个
Fixnum

irb(main):004:0> number.class
#=> Fixnum
的文档显示,该方法采用了一个可选参数
base
,默认值为
10

到(基数=10)

返回一个字符串,该字符串包含表示为
fix
radix
base
(介于2和36之间)的值

让我们试试
2

irb(main):005:0> number.to_s(2)
#=> "1100001"
看起来不错,但前导的0消失了。为了找回它,我们可以使用一种更强大的方法,称为,它允许我们精确地指定格式:

irb(main):006:0> sprintf('%08b', number)
#=> "01100001"
%08b
表示:

  • %
    启动一个格式序列
  • 0
    用零填充
  • 8
    宽度为8位
  • b
    二进制数
适用于您的程序 字母散列必须写成:(在Ruby中,变量名使用snake_大小写)

可以通过以下方式收集输出:(只需固定变量名)

但是为了打印
user\u message
中每个字符的哈希值,必须遍历字符(而不是哈希)。相应的方法称为:

我在上面的代码中使用了
printf
。它相当于打印sprintf(…)

一点重构
String
有另一种方法。它的工作原理类似于
每个字符
,但不是将每个字符传递给块,而是传递每个字节:

user_message.each_byte { |byte| printf('%08b', byte) }
lower_case_letters = {
  "a" => 0b01100001,
  "b" => 0b01100010,
  "c" => 0b01100011,
  # ...
  "z" => 0b01111010
}
user_message = gets.chomp
user_message.each_char do |character|
  number = lower_case_letters[character]
  printf('%08b', number)
end
user_message.each_byte { |byte| printf('%08b', byte) }