如何将字节/切片(UInt8)存储为Crystal中的字符串?

时间:2017-12-04 23:11:26

标签: redis crystal-lang

我正在通过MessagePack将对象编码为Bytes(即Slice(UInt8))。如何将其存储在仅接受字符串的数据存储客户端(例如Crystal-Redis)中?

2 个答案:

答案 0 :(得分:1)

如果您没有其他选择将Slice存储为字符串,则可以将其编码为String,但代价是性能降低。

Base64 strict_encode/decode

encoded = An_Object.to_msgpack # Slice(UInt8)
save_to_datastore "my_stuff", Base64.strict_encode(encoded)
from_storage = get_from_datastore "my_stuff"
if from_storage
   My_MsgPack_Mapping.from_msgpack( Base64.decode(from_storage) )
end

或者您可以使用Slice#hexstringString#hexbytes

encoded = An_Object.to_msgpack # Slice(UInt8)
save_to_datastore "my_stuff", encoded.hexstring
from_storage = get_from_datastore "my_stuff"
if from_storage && from_storage.hexbytes?
   My_MsgPack_Mapping.from_msgpack( from_storage.hexbytes )
end

(Crystal-Redis用户还有另一种选择:see this issue。)

答案 1 :(得分:0)

Crystal和Redis都应该能够处理具有无效UTF-8字节的字符串,因此您可以直接从切片创建String并将其存储到Redis,反之亦然。

这当然不是完全安全的:你应该确保避免调用任何期望有效UTF-8字符串的字符串方法。 但除此之外,这种直接的方法应该是完全没问题的。与使用字符串编码相比,它更快,内存效率更高。

redis.set key, String.new(slice)
redis.get(key).to_slice