Ruby将8位ASCII字符串转换为6位ASCII

时间:2020-09-25 13:53:15

标签: ruby-on-rails ruby

我是红宝石的新手,在处理字符和位时遇到了一个非常具体的问题。我需要将8个字符的字符串(以8位ASCII编码)转换为8个字符的字符串(以6位ASCII编码)。输入ist为8x8Bit = 64Bit长,输出应为8x6Bit = 48Bit长。转换非常容易。在每个字符上,擦除前2位,例如1001 0110-> 01 0110。

例如:字符串"UAL "(ASCII双:0101 0101 0100 0001 0100 1100)将转换为0101 0100 0001 0011 00其余部分填充为0(ASCII双)。

红宝石是否支持这种转换?如果没有,那么在没有很多依赖的情况下这样做的最佳方法是什么?

要参考设置此问题:我需要修改ASTERIX CAT62(https://www.eurocontrol.int/sites/default/files/content/documents/nm/asterix/cat062p9ed118.pdf)UDP数据包的字节。我感兴趣的字段是I062 / 380子字段2(在第79页的文档中)。在那里,您可以看到ASCII编码必须为6位。

EDT:解决方案

经过数小时的工作,我终于找到了正确的解决方案。

characters = "UAL     ".bytes
output_int = 0
shifter = 48
characters.each do |character|
  shifter -= 6
  output_int += (character & 0b00111111) << shifter #Convert to 6-Bit ASCII
end
hex_values = [
  (output_int >> 40) & 0b11111111,
  (output_int >> 32) & 0b11111111,
  (output_int >> 24) & 0b11111111,
  (output_int >> 16) & 0b11111111,
  (output_int >> 8) & 0b11111111,
  (output_int >> 0) & 0b11111111
]
output = ""
hex_values.each do |hex_value|
  output += [hex_value].pack("C")
end

0 个答案:

没有答案