serializable c#
Codificación de un entero en formato de 7 bits de C#BinaryReader.ReadString (5)
El BinaryReader
C#
tiene una función que de acuerdo con MSDN, lee un entero codificado como "entero de siete bits", y luego lee una cadena con la longitud de este entero.
¿Existe una documentación clara para el formato entero de siete bits (tengo un entendimiento aproximado de que el MSB o el LSB marca si hay más bytes para leer, y los bits restantes son los datos, pero estaré contento por algo más exacto). )
Mejor aún, ¿hay una implementación C
para leer y escribir números en este formato?
Bueno, la documentación para BinaryReader.Read7BitEncodedInt ya dice que espera que el valor se escriba con BinaryWriter.Write7BitEncodedInt y que la documentación del método detalla el formato:
El número entero del parámetro de valor se escribe siete bits a la vez, comenzando con los siete bits menos significativos. El bit alto de un byte indica si hay más bytes para escribir después de este.
Si el valor cabe en siete bits, solo toma un byte de espacio. Si el valor no cabe en siete bits, el bit alto se establece en el primer byte y se escribe. el valor se desplaza en siete bits y se escribe el siguiente byte. Este proceso se repite hasta que se haya escrito todo el entero.
Por lo tanto, el número entero 1259551277, en el binario 1001011000100110011101000101101 se convertirá a ese formato de 7 bits de la siguiente manera:
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
Sin embargo, no estoy tan seguro de mis habilidades en C para proporcionar una implementación en funcionamiento. Pero no es muy difícil de hacer, según esa descripción.
El formato se describe aquí: http://msdn.microsoft.com/en-us/library/system.io.binarywriter.write7bitencodedint.aspx
El método Write7BitEncodedInt contiene la descripción: los 7 bits más bajos de cada byte codifican los siguientes 7 bits del número. El bit más alto se establece cuando hay otro byte siguiente.
Tuve que explorar este formato de 7 bits también. En uno de mis proyectos, empaqueté algunos datos en archivos usando BinaryWriter de C # y luego los desempaqué de nuevo con BinaryReader, que funciona muy bien.
Más tarde, también tuve que implementar un lector para los archivos empaquetados de este proyecto para Java. Java tiene una clase llamada DataInputStream (en el paquete java.io), que tiene algunos métodos similares. Lamentablemente, la interpretación de los datos de DataInputStream es muy diferente a la de C #.
Para resolver mi problema, porté el BinaryReader de C # a Java escribiendo una clase que amplía java.io.DataInputStream. Este es el método que escribí, que hace exactamente lo mismo que BinaryReader.readString () de C #:
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);
}
/*
* 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;
}