Encoding 将数字转换为最多96个状态的7位字

Encoding 将数字转换为最多96个状态的7位字,encoding,binary,bit,Encoding,Binary,Bit,我想把一些信息编码在Code128条形码中,允许在一个插槽中使用96个不同的字符。因此,95十进制将转换为101 1111b,96转换为1000 0000b 现在我需要一个算法,将十进制(或二进制)数转换为最多96个状态的7位字。我整个上午都坐在这里试图弄清楚这个算法(玩位移位和对数),但似乎我遗漏了一些重要的要点 例如,我如何将537(10 0001 1001b)翻译成这样的单词?在玩了一点数字之后,我终于找到了解决方案。对于883.736: 883.736 / 96 = 9.205 R: 5

我想把一些信息编码在Code128条形码中,允许在一个插槽中使用96个不同的字符。因此,
95
十进制将转换为
101 1111b
96
转换为
1000 0000b

现在我需要一个算法,将十进制(或二进制)数转换为最多96个状态的7位字。我整个上午都坐在这里试图弄清楚这个算法(玩位移位和对数),但似乎我遗漏了一些重要的要点


例如,我如何将
537
10 0001 1001b
)翻译成这样的单词?

在玩了一点数字之后,我终于找到了解决方案。对于
883.736

883.736 / 96 = 9.205 R: 56
  9.205 / 96 =    95 R: 85
     95 / 96 =     0 R: 95
这些数字可以转换成7位字。要获取原始值,请执行以下操作:

883.736 = 56 * 96^0 + 85 * 96^1 + 95 * 96^2
用C#(小端)表示的算法:

public static class Base96
{
  private const int BASE = 96;

  public static byte[] Encode(int number)
  {
    var list = new List<Byte>();

    do
    {
      list.Add((byte)(number % BASE));
    }
    while ((number = (number / BASE)) > 0);

    return list.ToArray();
  }

  public static int Decode(byte[] words)
  {
    int result = 0;

    for (int i = 0; i < words.Length; i++)
    {
      result += (words[i] * (int)Math.Pow(BASE, i));
    }

    return result;
  }

}

用大约96个不同字母的字母表将任意二进制数据编码成序列通常称为

当您的“二进制”输入字节流是“短”的,并且可能有256个可能的字节中的任何一个,但大部分是ASCII文本(字母、数字),让字母和数字表示它们自己(1个输入字节到1个输出字母)是最紧凑的,为超出该范围的字节保留一个或四个“转义”符号(扩展1个“异常字节”)三个或两个输出字母),如在编码中

当二进制输入字节流的所有256个可能字节的频率或多或少相等时(即,该流已加密或压缩,或两者兼有),最简单的方法是使用诸如十六进制(将每个八位字节扩展为2个十六进制数字)或(将5个八位字节扩展为8个基32位)或(将3个八位字节扩展为4个base64位)或(将4个八位字节扩展为5个base85位)或

当您的二进制输入字节流具有不等频率(例如包含大部分ASCII文本)或重复,并且“足够长”时,最紧凑的方法是首先压缩它(可能使用or或DEFLATE or),创建一个频率大致相等的压缩字节流,然后按上述方式对该字节流进行编码

var encoded = Base96.Encode(883736);
var decoded = Base96.Decode(encoded);