2

在我正在制作的 Android 应用程序中,当输入特定文本时,它会根据特定算法进行编码。然后它应该作为文本消息发送到另一个设备,其中包含可以解码编码文本的相同应用程序。编码和解码部分运行良好,但编码时会产生很长的String. 例如,

当文本“Hello World!” 被编码,它产生下面的字符串:

zN6xdwB8486d6I6I6T1p5B6T7N6I6x2z1reIWPTp

因此,由于这是一条短信,平均文本会产生非常长的String. 那么有什么方法String可以将这种编码减少到合理的大小?或者我可以以任何其他方式将其作为文本消息(作为序列化 Java 对象(如果在 Android 中可能的话)或其他方式)发送?

提前致谢。

4

5 回答 5

2

尝试使用霍夫曼代码压缩数据。

于 2012-08-20T14:21:54.267 回答
2

没有任何通用方法可以将任何字符串缩减为具有较少字符数的字符串。这在直觉上应该是有道理的——如果你试图将 1,000,000 个字符串映射到 100,000 个字符串上,就会出现重复。

此外,如果您试图阻止其他人说出您发送的数据是什么,您会遇到其他问题 - 您需要做出明智的加密决定。 不要制作自己的加密算法。

因此,我们需要更多信息才能提供任何有用的信息。您会使用可能字符串的子集吗?

于 2012-08-20T14:37:11.623 回答
1

看起来 SMS 可以携带二进制数据,所以你最好使用 AES 或类似的东西。您可能可以将其配置为使用静态的 IV 和从密码生成的密钥(另一端的人将共享)。您也可以在发送之前对字符串进行霍夫曼编码,这会进一步缩小它,可能会将消息的最大长度延长到 140 个字符以上。它看起来像这样:

For sending:

input string --> compressed blob --> encrypted blob --> SMS
                                 |
                                  -> known encrypt params 

For receiving:

SMS --> encrypted blob --> compressed blob --> original string
                         |
   known encrypt params -^

您有时可能会绕过压缩步骤。一些字符串不能很好地压缩,并且有一点点与压缩相关的开销,所以在某些情况下,它可能会使字符串变大。

如果将加密参数留在加密的 blob 中,它们将构成开销。(算法、IV、填充方案等)。如果您每次都使用其中一组,您只需将它们硬编码到程序中,您就不需要每次都发送它们。

于 2012-08-20T14:59:09.290 回答
0

您可以使用一些小算法来解码您的字符串。

或者你可以像这样实现简单的算法

originalString = "hello";

每个字符+1 例如:a = b, b=c....等或

每个字符=3 ex a = d, b=h ....

encodedString ="ifmmp"

所以字符数将保持原样,您将解码您的字符串

于 2012-08-20T14:23:37.457 回答
0

您有 26+26+10 个需要 6 位的 ASCII 字符,并且可以将 char(短于 2 个字节)转换为

字符串“012345678901234567890”使用 21 个字符或 42 个字节,可以在 2 个long16 个字节的连接中迁移。

但正如@elyashiv 所说,使用好的算法是更好的方法。

编辑

A-Aa-z0-9 是您的字符串的字符:
它们可以转换为 0-> 61 位编码的 6 位数字

因此,您可以每次使用 <<6 将它们添加到 long 中。最后一个字符(第 11 个)被拆分,并开始第二个长字符。

您必须在字节上找到一个变送器。

如果消息传递需要字符串字符,则必须使用八进制,并跳过第一个不可打印的字符。所以你可以把 7 个数字放在一个很长的位置(使用 <<7 贴花位)。

于 2012-08-20T14:41:48.250 回答