代码之家  ›  专栏  ›  技术社区  ›  yamspog

如何用少于2*n个字符表示n字节数组

  •  3
  • yamspog  · 技术社区  · 15 年前

    考虑到n字节数组可以用十六进制表示为2*n字符串,有没有一种方法可以用少于2*n个字符表示n字节数组?

    例如,一个整数(int32)通常可以看作是一个4字节的数据数组。

    7 回复  |  直到 15 年前
        1
  •  8
  •   Matthew Slattery    15 年前

    十六进制的优点是将一个8位字节分成两个相等的半字节,这是将一个字节映射到可打印的ASCII字符的最简单方法。更有效的方法将多个字节视为一个块:


    Base-64一次使用64个ASCII字符表示6位。每3个字节(即24位)分为4个6位的base-64位,其中“数字”为:

    ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
    

    (如果输入不是3字节长的倍数,则为第65个字符,” = “,用于在末尾填充)。请注意,Base-64有一些变体,在最后两个“数字”中使用不同的字符。


    ascii85是另一种表示形式,虽然不太出名,但通常使用:二进制数据通常是在PostScript和PDF文件中编码的。这将每4个字节(big endian)视为无符号整数,以85为基数表示为5位数字,每个85位数字编码为ASCII代码33+N(即 ! 对于0,最多 u “用于84)-加上特殊情况,其中单个字符” z “可以使用(而不是” !!!!! “)表示4个零字节。

    (为什么是85?因为84 lt;2 三十二 lt;85 )

        2
  •  4
  •   tobyodavies    15 年前

    是的,使用二进制(在这种情况下,它需要n个字节,这并不奇怪),或者使用任何高于16的基数,一个常见的基数是64。

        3
  •  2
  •   SingleNegationElimination    15 年前

    它可能取决于您想要表示的确切数字。例如,如果使用素数表示的乘积(即“2^63”),则9223372036854775808这个数字需要8个字节以二进制表示,在ASCII中只需要4个字节。

        4
  •  1
  •   Assaf Lavie    15 年前

    怎么样 base-64 ?

    这完全取决于您愿意在编码中使用什么字符(即表示)。

        5
  •  1
  •   Ignacio Vazquez-Abrams    15 年前

    base64适合每个字符6位,这意味着3个字节将适合4个字符。

        6
  •  1
  •   Vovanium    15 年前

    使用大约90000个已定义的Unicode字符中的65536个,您可以用n/2个字符表示二进制字符串。

        7
  •  0
  •   JoshD    15 年前

    对。使用多于0-9和a-f的字符。单个字符(假设为8位)可以有256个值,因此可以用n个字符表示n字节数。

    如果它需要可打印,您可以选择一些字符集来表示各种值。在这种情况下,一个好的选择是Base-64。