suchen

Heim  >  Fragen und Antworten  >  Hauptteil

stl - c/c++ Fragen zu binären Operationen (übrigens auf der Suche nach guten Bibliotheken und Methoden)

Ich arbeite derzeit an einem Projekt zur Inhaltskomprimierung, bei dem die Daten binär verarbeitet werden müssen (z. B. LZ77-Komprimierung, Huffman-Codierung usw.), was viele Funktionen und Funktionen umfasst.

Aber als ich es selbst machte, stellte ich fest, dass C++ zwar eine relativ umfassende Binäroperation bereitstellt, diese jedoch hauptsächlich auf einem bestimmten Datentyp für Binäroperationen (z. B. char) basiert und char standardmäßig 8-Bit ist, was nicht der Fall ist Geeignet für zeichenübergreifende Operationen. Es ist sehr praktisch und erfordert viel Urteilsvermögen.

Vielleicht ist das, was ich ausgedrückt habe, nicht ganz klar, oder es gibt ein Problem mit meinem Verständnis von C++, aber ich hoffe, eine Methode zu finden, die Binärdateien reibungslos verarbeiten kann ... Oder gibt es eine Bibliothek, die einfacher zu verwenden ist?

Hat jemand Erfahrung in diesem Bereich und kann mir einen Rat geben? Wenn es hilft, schicke ich Ihnen privat einen roten Umschlag, um meine Dankbarkeit auszudrücken.

天蓬老师天蓬老师2731 Tage vor806

Antworte allen(2)Ich werde antworten

  • 巴扎黑

    巴扎黑2017-06-05 11:13:09

    如果你想要大一点的字符表示范围,可以用wchar_t。
    如果你想要一个可以把内存中的数据以任意一位作为一个字节的开始的类型,那肯定是不可能实现的。

    但是你可以
    `nl=((arr[0]&c0)>>6);
    nh=((arr[1] &0x0f) << 2);
    n=nh|nl;`
    来把前一个字节的高2位和后一个字节的低4位拼成一个6位二进制数

    Antwort
    0
  • 给我你的怀抱

    给我你的怀抱2017-06-05 11:13:09

    都用二进制了,还考虑字符?
    二进制就应该只考虑字节吧?
    压缩算法的话,很多时候是不考虑字符的,因为输入文件可能是ASCII,可能是UTF-8,可能是UTF-16(LE/BE),或者GBK等等。但是归根究底,语言的共性就是统计上存在一定规律。
    比如英文中e的出现频率高,或者is这种单词出现频率高,或者se、tor之类的词缀出现频率高。
    压缩的根本原理就是用尽量少的bit代表出现频率高的东西,减少冗余,所以一般来说跟字符没关系。

    你多了解一下压缩算法吧,LZ77/LZ78/霍夫曼这些都是通用的压缩算法,不只局限于文本,是以bit为单位的。

    说回C++,C++要求一个东西的大小编译期可知(栈分配内存编译器确定),而输入的文本运行期才知道,所以理论上没有什么很好的方法。字符集、文本编码是一个深坑,不建议跳进去。

    如果你是说要以bit为单位做操作的话,自己封装一个库吧,或者boost之类的有一些库能用。毕竟CPU里最小也是一个字节,只不过能操作里面的每一位而已。

    Antwort
    0
  • StornierenAntwort