ASCII-7 "String"



  • Hallo zusammen,

    hab leider keinen besseren Titel gefunden 😞
    Ich bekomme von einem Messgerät einen char Buffer welche Text im ASCII-7 Format enthält.
    Gibt es irgendwelche fertige Funktionen (C oder C++) welche mir das ganze in einen 8Bit ASCII Format konvertiert?

    Und damit es nicht so einfach ist, das ganze auch noch einmal anderst herum als ASCII-8 nach ASCII-7.

    MfG Stephan



  • Was verstehst du denn unter ASCII-7 bzw ASCII-8?
    Gib mal ein Beispiel.

    Falls du damit die Bits meinst, dann ist das egal, da ASCII sowieso nur für 7 Bit definiert ist.
    Und wenn die Übertragung Byte/Zeichenweise erfolgt brauchst du nichts machen.



  • Ich gehe davon aus, daß Du dich auf üblicher PC-Hardware bewegst.
    ASCII ist nur sieben Bit breit. Im char ist das oberste Bit dann einfach Null. Wenn Du die Daten schon als char-Array geliefert bekommst, denke ich, daß dein OS/HW sich bereits drum kümmert, Du also nichts weiter beachten mußt.



  • Also,
    - ASCII-7 7bit ASCII Zeichen
    - ASCII-8 8bit ASCII Zeichen

    das Problem ist, daß ein Zeichen nur 7Bit lang ist und im 8. Bit des char schon ein Bit vom neuen Zeichen steht.

    Binär (steht auch so im Speicher):
    1000001 1000010 1000011
    
    entspricht als Zeichen
    ABC
    

    Es handelt sich hierbei um einen TEDs (IEEE 1451) Speicher (Konfigurationsdaten eines Sensors).

    Ich hoffe es ist klar was ich meine, sonst bitte nochmals Fragen.
    Danke.



  • Stephan schrieb:

    und im 8. Bit des char schon ein Bit vom neuen Zeichen steht

    Das ist noch sehr unpräzise. Es ist nicht klar, wie die 7-Bit-Zeichen im char-Array kodiert sind.

    bit | 7 6 5 4 3 2 1 0
    -------+----------------
    byte 0 | ? ? ? ? ? ? ? ?
    byte 1 | ? ? ? ? ? ? ? ?
    byte 2 | ? ? ? ? ? ? ? ?
    

    Wie stehen da jetzt die 7-Bit-Zeichen drin?!

    most significant bit first:

    bit | 7 6 5 4 3 2 1 0
    -------+----------------
    byte 0 | 1 0 0 0 0 0 1|1
    byte 1 | 0 0 0 0 1 0|1 0
    byte 2 | 0 0 0 1 1|.....
    

    least significant bit first:

    bit | 7 6 5 4 3 2 1 0
    -------+----------------
    byte 0 | 0|1 0 0 0 0 0 1
    byte 1 | 1 1|1 0 0 0 0 1
    byte 2 | .....|1 0 0 0 0
    

    Dies sind hier nur mal die zwei naheliegensten Möglichkeiten.

    Aber im Wesentlichen kannst du dir ein "reader"-Objekt nach folgendem Pseudo-Code bauen:

    template< class OctetInputIterator = unsigned char const* >
    class bit_reader
    {
      OctetInputIterator oii;
      unsigned buffer_dat;
      unsigned buffer_len;
    
      void next_octet_to_buffer();
    
    public:
      explicit bit_reader(OctetInputIterator oii)
      : oii(ooi), buffer_dat(0), buffer_len(0)
      {}
    
      unsigned long read(unsigned num_of_bits);
    };
    
    template<class OctetInputIterator>
    unsigned long bit_reader<OctetInputIterator>::read(unsigned num_of_bits)
    {
      unsigned long result = 0;
      while (num_of_bits) {
        if (buffer_len==0)
          next_octet_to_buffer();
    
        const unsigned block = min(num_of_bits,buffer_len);
    
        ...block Bits aus buffer nach result verschieben...
    
        num_of_bits -= block;
      }
      return result;
    }
    
    int main()
    {
      unsigned char data[] = {...};
      bit_reader<> br (data);
      int a = br.read(7);
      int b = br.read(7);
      int c = br.read(7);
    }
    

Anmelden zum Antworten