Crystal中的Encoding.ASCII.GetBytes(cArr)

时间:2017-02-17 15:46:17

标签: c# crystal-lang

我将一些C#代码转换为项目的Crystal代码:我的目标是将字符串转换为ASCII字节数组。

C#代码

C#代码如下:

string expression = "nYrXa@9Q\x00bf1&hCWM\\9(731Bp?t42=!k3.";
char[] cArr = expression.ToCharArray();
byte[] bytes = Encoding.ASCII.GetBytes(cArr);

Wich给出:

{byte[32]} = 110, 89, 114, 88, 97, 64, 57, 81, 63, 49, 38, 104, 67, 87, 77, 92, 57, 40, 55, 51, 49, 66, 112, 63, 116, 52, 50, 61, 33, 107, 51, 46

Crystal实现

temp = "nYrXa@9Q\x00bf1&hCWM\\9(731Bp?t42=!k3."
byteDecKey = temp.to_slice
array = [] of UInt8
temp.each_char do |char|
    array << char.bytes[0] unless !char.ascii?
end

puts "EachChrKey: #{array}"
puts "ByteDecKey: #{byteDecKey}"

结果:

EachChrKey:      [110, 89, 114, 88, 97, 64, 57, 81, 120, 48, 48, 98, 102, 49, 38, 104, 67, 87, 77, 92, 57, 40, 55, 51, 49, 66, 112, 63, 116, 52, 50, 61, 33, 107, 51, 46]
ByteDecKey: Bytes[110, 89, 114, 88, 97, 64, 57, 81, 120, 48, 48, 98, 102, 49, 38, 104, 67, 87, 77, 92, 57, 40, 55, 51, 49, 66, 112, 63, 116, 52, 50, 61, 33, 107, 51, 46]
C Sharp   : Bytes[110, 89, 114, 88, 97, 64, 57, 81, 63, 49, 38, 104, 67, 87, 77, 92, 57, 40, 55, 51, 49, 66, 112, 63, 116, 52, 50, 61, 33, 107, 51, 46]

我做错了吗?

1 个答案:

答案 0 :(得分:3)

在您的C#代码中,\x00bf被解释为表示字节0xbf的转义码,而在crystal中,字符串不支持\x转义码,因为字符串只能包含有效值Unicode格式。因此,字符串的内容包含字符x00bf,而不是信号字节0xbfEncoding.ASCII.GetBytes似乎用0xbf替换了未知字节?

我建议使用Slice(UInt8)来保存二进制数据,并使用某些编码方法(如base64)来传输数据(如果需要它作为字符串)。字符串只包含有效的unicode,而不包含任意数据。