如何从8位字节转换为7位字节(Base 256到Base 128)

如何从8位字节转换为7位字节(Base 256到Base 128)

我希望做这样的事情:

public string BytesToString(byte[] in) { } public byte[] StringToBytes(string in) { } 

我知道base64可用,但它扩展了一个字节数组太多了。

Base64每个字符编码6位,产生一个字符串,只需很少的努力就可以可靠地传输(模数小心URL)。

没有具有相同属性的7位字母表 – 例如,如果给出控制字符, 许多系统将失败。

绝对确定你不需要经历任何这样的系统(包括存储)吗? 这个额外的微小空间节省真的足以certificate必须担心某些东西是否会将“\ n”更改为“\ r \ n”或反之,或者丢弃字符0?

(对于存储示例,2100字节= base64中的2800个字符,或base128中的2400个字符。与IMO不同。)

我强烈建议您查看是否可以找到额外的存储空间 – 以后可能会节省很多麻烦。

您正在寻找UTF-7吗?

或者,有一个ASCIIEncoding类,它将UTF-8字符串转换为8位字节的数组,丢弃无法用7位ASCII表示的字符。

从您的问题(目前的情况)确定您要实现的目标有点困难。 您是尝试进行base-128编码,还是尝试将表示7位数的一系列(可能是hex)数字转换为等效的二进制8位数?

我刚刚描述的编码是ID3v2标记格式中用于编码标题中的大小字段的编码。

如果这是你想要实现的,那么下面的代码可能就是这样的。 它基于ID3规范中的’257’示例:

 [Test] public void GetInt() { var bytes = new byte[] { 0, 0, 2, 1}; var result = 0; foreach (var b in bytes) { result <<= 7; result = result + (b & 0x7f); } Assert.That(result, Is.EqualTo(257)); } [Test] public void SetInt() { var i = 257; var bytes = new Stack(); for (var j = 0 ; j < sizeof(int) ; j++) { var b = (byte)(i & 0x7f); bytes.Push(b); i >>= 7; } Assert.That(bytes.Pop(), Is.EqualTo(0)); Assert.That(bytes.Pop(), Is.EqualTo(0)); Assert.That(bytes.Pop(), Is.EqualTo(2)); Assert.That(bytes.Pop(), Is.EqualTo(1)); }