从字节数组中缩短字符串

本文关键字:字符串 数组 字节 字节数 | 更新日期: 2023-09-27 18:18:54

我有一个结构,我要转换为长度为37的字节数组,然后从它转换为字符串。

我正在写一个非常基本的激活类型库,这个字符串将在人与人之间传递。所以我想把它的长度从37缩短到更容易输入的长度

现在:

  • 将结构转换为字节数组,
  • 将字节数组转换为64位字符串(仍然太长)。

什么是一个很好的方法来缩短这个字符串,但仍然保持其中存储的数据?

谢谢。

从字节数组中缩短字符串

在一般情况下,从任意字节[]到字符串需要更多的数据,因为我们假设要避免不可打印的字符。减小的唯一方法是在base-whatever之前进行压缩(您可以获得比base-64高一点的值,但不多——而且显然不太"友好")——但是对于如此短的大小,压缩不会真正起作用。基本上,你不能这么做。你想把一夸脱装进一品脱的罐子里,而那行不通

你可能不得不重新考虑你的需求。也许可以在内部保存BLOB,并发出一个较短的令牌(可能是10个字符,可能是一个guid),该令牌是到实际的BLOB。

数据压缩可能是一种可能性,但是您不能将40字节的消息压缩到6字节(例如)。

如果可能的字符串/类型的空间有限,则将它们映射到列表(信息编码)。

我不知道还有什么比base-64更好的了,如果你真的需要传递这个值,如果用户需要输入它。

如果你有一个中央数据存储,他们都可以访问,你可以给他们你保存它的行ID。当然,这取决于这些数据需要有多"保密"。

但我怀疑,如果你试图使用这个激活,你需要他们有一个实际的值。

如何传递字符串?你能指望用户只是复制/粘贴吗?也许花点时间清理来自电子邮件阅读器的多余换行符,甚至你的"从这里复制"answers"复制到这里"行可能会有更多的成果!

字符串中的字符可以有不可打印的字符吗?如果是这样,您不需要对字节进行base64编码,您可以简单地从它们创建字符串(节省33%)

string str = new string(byteArray.Cast<char>().ToArray());

另外,字节数组中的值是否受到某种程度的限制?如果它们落在某个范围内(即,不是所有256个可能的值),您可以考虑在字符串的每个字符中填充两个。

如果您真的有37字节的非冗余信息,那么您就不走运了。压缩在某些情况下可能会有所帮助,但如果这是一个激活密钥,我建议使用相同长度的密钥(压缩不会强制这样做)。

如果这段代码要通过电子邮件传递,那么我认为使用更大的密钥没有问题。另一种选择可能是每5个左右字符插入连字符,将其分成更小的块(例如XXXXX-XXXXX-XXXXX-XXXXX-XXXXX)。

使用160位哈希并希望没有碰撞?它会短得多。如果您可以使用查找表,请使用128位甚至64位的增量值。比你的37个字符短多了