将字符串的每个字符的 CRC32 校验和值添加到数组中
Add the CRC32 checksum value of each character of a string, into an array
我正在尝试遍历一个字符串并将每个字符的 CRC32 校验和放入一个数组中。我正在使用 .each_char
方法这样做:
def calculate_signature(data)
signature = [] of UInt32
data.each_char do |c|
signature << CRC32.checksum(c)
end
end
当我 运行 执行此操作时,我收到了一条非常长且无用的错误消息。
Error in sigwaf.cr:4: instantiating 'calculate_signature(String)'
calculate_signature("yrdy")
^~~~~~~~~~~~~~~~~~~
in lib/settings.cr:17: instantiating 'String#each_char()'
data.each_char do |c|
^~~~~~~~~
in /usr/local/Cellar/crystal/0.29.0/src/string.cr:3773: instantiating 'each_byte()'
each_byte do |byte|
^~~~~~~~~
in /usr/local/Cellar/crystal/0.29.0/src/string.cr:3881: instantiating 'Slice(UInt8)#each()'
to_slice.each do |byte|
^~~~
in /usr/local/Cellar/crystal/0.29.0/src/indexable.cr:187: instantiating 'each_index()'
each_index do |i|
^~~~~~~~~~
in /usr/local/Cellar/crystal/0.29.0/src/indexable.cr:187: instantiating 'each_index()'
each_index do |i|
^~~~~~~~~~
in /usr/local/Cellar/crystal/0.29.0/src/string.cr:3881: instantiating 'Slice(UInt8)#each()'
to_slice.each do |byte|
^~~~
in /usr/local/Cellar/crystal/0.29.0/src/string.cr:3773: instantiating 'each_byte()'
each_byte do |byte|
^~~~~~~~~
in lib/settings.cr:17: instantiating 'String#each_char()'
data.each_char do |c|
^~~~~~~~~
in lib/settings.cr:18: instantiating 'CRC32:Module#checksum(Char)'
signature >> CRC32.checksum(c)
^~~~~~~~
in /usr/local/Cellar/crystal/0.29.0/src/crc32/crc32.cr:9: instantiating 'update(Char, UInt32)'
update(data, initial)
^~~~~~
in /usr/local/Cellar/crystal/0.29.0/src/crc32/crc32.cr:13: undefined method 'to_slice' for Char
slice = data.to_slice
^~~~~~~~
Rerun with --error-trace to show a complete error trace.
如何才能成功地将 crc32 校验和添加到数组中?
试试这个:
require "crc32"
def calculate_signature(data)
signature = [] of UInt32
data.chars.each do |c|
signature << CRC32.checksum(c.to_s)
end
signature
end
puts calculate_signature("string")
你收到错误是因为 Char
不是 array of String
,它是另一种类型 array of Chars
。 Char
没有 CRC32 在此 row 上调用的方法 .to_slice
,它会引发错误。我只是在 each
中为 Chart 添加 .to_s
并且它有效。您也可以将 .chars
替换为 .split("")
并得到相同的结果。
错误消息 «undefined method 'to_slice' for Char» 正是关于它。
我正在尝试遍历一个字符串并将每个字符的 CRC32 校验和放入一个数组中。我正在使用 .each_char
方法这样做:
def calculate_signature(data)
signature = [] of UInt32
data.each_char do |c|
signature << CRC32.checksum(c)
end
end
当我 运行 执行此操作时,我收到了一条非常长且无用的错误消息。
Error in sigwaf.cr:4: instantiating 'calculate_signature(String)'
calculate_signature("yrdy")
^~~~~~~~~~~~~~~~~~~
in lib/settings.cr:17: instantiating 'String#each_char()'
data.each_char do |c|
^~~~~~~~~
in /usr/local/Cellar/crystal/0.29.0/src/string.cr:3773: instantiating 'each_byte()'
each_byte do |byte|
^~~~~~~~~
in /usr/local/Cellar/crystal/0.29.0/src/string.cr:3881: instantiating 'Slice(UInt8)#each()'
to_slice.each do |byte|
^~~~
in /usr/local/Cellar/crystal/0.29.0/src/indexable.cr:187: instantiating 'each_index()'
each_index do |i|
^~~~~~~~~~
in /usr/local/Cellar/crystal/0.29.0/src/indexable.cr:187: instantiating 'each_index()'
each_index do |i|
^~~~~~~~~~
in /usr/local/Cellar/crystal/0.29.0/src/string.cr:3881: instantiating 'Slice(UInt8)#each()'
to_slice.each do |byte|
^~~~
in /usr/local/Cellar/crystal/0.29.0/src/string.cr:3773: instantiating 'each_byte()'
each_byte do |byte|
^~~~~~~~~
in lib/settings.cr:17: instantiating 'String#each_char()'
data.each_char do |c|
^~~~~~~~~
in lib/settings.cr:18: instantiating 'CRC32:Module#checksum(Char)'
signature >> CRC32.checksum(c)
^~~~~~~~
in /usr/local/Cellar/crystal/0.29.0/src/crc32/crc32.cr:9: instantiating 'update(Char, UInt32)'
update(data, initial)
^~~~~~
in /usr/local/Cellar/crystal/0.29.0/src/crc32/crc32.cr:13: undefined method 'to_slice' for Char
slice = data.to_slice
^~~~~~~~
Rerun with --error-trace to show a complete error trace.
如何才能成功地将 crc32 校验和添加到数组中?
试试这个:
require "crc32"
def calculate_signature(data)
signature = [] of UInt32
data.chars.each do |c|
signature << CRC32.checksum(c.to_s)
end
signature
end
puts calculate_signature("string")
你收到错误是因为 Char
不是 array of String
,它是另一种类型 array of Chars
。 Char
没有 CRC32 在此 row 上调用的方法 .to_slice
,它会引发错误。我只是在 each
中为 Chart 添加 .to_s
并且它有效。您也可以将 .chars
替换为 .split("")
并得到相同的结果。
错误消息 «undefined method 'to_slice' for Char» 正是关于它。