【发布时间】:2012-08-27 07:50:09
【问题描述】:
Redis keys are binary safe。我想搞砸并使用 C# 将二进制文件放入 redis。我选择的客户不支持编写二进制密钥,它使用密钥,这很有意义。但是我只是在胡闹,所以告诉我我该怎么做。
如何将原始字节[] 转换为字符串?起初我正在考虑将 byte[] 转换为 utf8 字符串,但是 unicode 有一些检查来查看它是否有效。所以原始二进制文件应该会失败。
其实我试过了。我没有失败,而是得到了一个奇怪的结果。我的主要问题是如何将原始 byte[] 转换为等效字符串?就像将原始字节 [] 作为字符串而不是编码为 base32/64/hex/whatever 一样。我不重要的问题是为什么我得到一个 512 字节的字符串而不是一个异常说这不是一个有效的 UTF8 字符串?
代码
var rainbow = new byte[256];
for (int i = 0; i < 256; i++)
{
rainbow[i] = (byte)i;
}
var sz = Encoding.UTF8.GetString(rainbow);
var szarr = Encoding.UTF8.GetBytes(sz);
Console.WriteLine("{0} {1} {2}", ByteArraysEqual(szarr, rainbow), szarr.Length, rainbow.Length);
输出
假 512 256
【问题讨论】:
-
@dbaseman:不,我不想将二进制编码为文本。我想要字符串结构中的原始二进制文件。现在我编辑了一行...
-
我认为接受的答案是危险的错误......另外:如果您使用的是 BookSleeve,我花了很多时间考虑二进制密钥(BookSleeve 使用二进制协议,所以它是微不足道的做) - 问题很简单:我认为绝大多数用户将使用字符串键 - 不确定是否值得加倍 API 来支持两者。有一种厚颜无耻的方式,我可以在一个 API 上同时支持这两种方式,但这将是一个突破性的变化。
-
@MarcGravell 你可以,但我实际上并不打算这样做。可能在 C 中针对特定问题,但是....我必须进行测试,看看它是否值得。在我考虑之前,它必须是大量的键,我仍然想测试,我仍然需要做前缀(不能使用 bytesForId,需要一个字节或 txt 前缀来评论 VS 帖子 VS 其他一些 id)。我认为它不值得,除非你在一个主要项目中看到它的用途。就像我说的那样,我能想到的唯一生产项目(我正在做 redis 是为了好玩)是在 C 中,而不是 C#
标签: c# .net string binary bytearray