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

时间:2009-06-10 17:16:05

标签: c#

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

我希望做这样的事情:

public string BytesToString(byte[] in)
{

}

public byte[] StringToBytes(string in)
{

}

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

4 个答案:

答案 0 :(得分:5)

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

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

您是否绝对确定您不需要通过任何此类系统(包括存储)?这个额外的微小空间节省真的足以证明必须担心某些东西是否会改变“\ n”到“\ r \ n”或反之亦然,或者丢弃字符0?

(对于一个存储示例,2100字节= base64中的2800个字符,或base128中的2400个字符。与IMO没有太大区别。)

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

答案 1 :(得分:0)

UTF-7您要找的是什么?

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

我刚才描述的编码是ID3v2 tag format中用于编码the size field in the header的编码。

如果这是你想要实现的目标,那么下面的代码可能就是这样。它基于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<byte>();

    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));
}