2009-10-11 10 views
8

C# 's BinaryReader ma funkcję, która zgodnie z MSDN odczytuje liczbę całkowitą zakodowaną jako "siedmiocyfrowa liczba całkowita", a następnie odczytuje ciąg o długości tej liczby całkowitej .Kodowanie liczby całkowitej w 7-bitowym formacie C# BinaryReader.ReadString

Czy jest czytelna dokumentacja dla siedmiobitowego formatu liczby całkowitej (mam nieobliczalne pojęcie, że MSB lub LSB zaznacza, czy jest więcej bajtów do odczytu, a pozostałe bity są danymi, ale będę zadowolony dla czegoś bardziej dokładnego).

Jeszcze lepiej, czy istnieje implementacja C do odczytu i zapisu liczb w tym formacie?

Odpowiedz

10

Dobrze, dokumentacja dla BinaryReader.Read7BitEncodedInt już mówi, że spodziewa się, że wartość jest napisany z BinaryWriter.Write7BitEncodedInt i że dokumentacja metoda szczegóły format:

Liczba całkowita parametru wartość jest zapisywana na siedem bitów przy A czas, zaczynając od siedmiu najmniej znaczących bitów. Wysoki bit bajta wskazuje, czy po nim jest więcej bajtów.

Jeśli wartość będzie pasować do siedmiu bitów, zajmuje tylko jeden bajt spacji. Jeśli wartość nie mieści się w siedmiu bitach, wysoki bit jest ustawiany na pierwszym bajcie i zapisywany. wartość jest następnie przesunięta o siedem bitów i zapisywany jest następny bajt. Ten proces powtarza się, dopóki cała liczba całkowita nie zostanie zapisana.

więc całkowitą 1259551277, w binarnym 1001011000100110011101000101101 zostaną przekształcone w tym formacie 7-bitowym, co następuje:

Remaining integer     encoded bytes 
1001011000100110011101000101101 
100101100010011001110100   00101101 
10010110001001100     10101101 01110100 
1001011000      10101101 11110100 01001100 
100        10101101 11110100 11001100 01011000 
0         10101101 11110100 11001100 11011000 00000100 

nie jestem przekonany, że w moich umiejętnościach C już teraz, aby zapewnić realizację roboczą , chociaż. Ale na podstawie tego opisu nie jest to trudne.

2

Metoda Write7BitEncodedInt zawiera opis: Najniższe 7 bitów każdego bajtu koduje kolejne 7 bitów numeru. Najwyższy bit jest ustawiany, gdy występuje kolejny bajt.

4

miałem do zbadania tego formatu 7-bitowe również. W jednym z moich projektów pakuję niektóre dane do plików za pomocą Cinary's BinaryWriter, a następnie rozpakowuję je ponownie za pomocą BinaryReader, który działa ładnie.

Później musiałem też zaimplementować czytnik dla spakowanych plików tego projektu dla Javy. Java ma klasę o nazwie DataInputStream (w pakiecie java.io), która ma podobne metody. Niestety, interpretacja danych DataInputStream różni się znacznie od interpretacji C#.

Aby rozwiązać mój problem, przeportowałem C# 's BinaryReader na Javę, pisząc klasę, która rozszerza java.io.DataInputStream. Oto metoda pisałem, która robi dokładnie tak samo jak C# 's BinaryReader.readString():

public String csReadString() throws IOException { 
    int stringLength = 0; 
    boolean stringLengthParsed = false; 
    int step = 0; 
    while(!stringLengthParsed) { 
     byte part = csReadByte(); 
     stringLengthParsed = (((int)part >> 7) == 0); 
     int partCutter = part & 127; 
     part = (byte)partCutter; 
     int toAdd = (int)part << (step*7); 
     stringLength += toAdd; 
     step++; 
    } 
    char[] chars = new char[stringLength]; 
    for(int i = 0; i < stringLength; i++) { 
     chars[i] = csReadChar(); 
    } 
    return new String(chars); 
} 
+1

Idealny. Dokładnie to, czego szukałem. – ains

2
/* 
* Parameters: plOutput[out] - The decoded integer 
*    pbyInput[in] - Buffer containing encoded integer 
* Returns:  Number of bytes used to encode the integer 
*/ 
int SevenBitEncodingToInteger(int *plOutput, char *pbyInput) 
{ 
    int lSize = 0; 
    int lTemp = 0; 
    while(true) 
    { 
     lTemp += pbyInput[lSize] & 0x7F; 
     if(pbyInput[lSize++] > 127) 
      lTemp <<= 7; 
     else 
      break; 
    } 
    *plOutput = lTemp; 
    return lSize; 
} 
Powiązane problemy