我是红宝石的新手,在处理字符和位时遇到了一个非常具体的问题。我需要将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