C#
'sBinaryReader
には、MSDNによると、「7ビット整数」としてエンコードされた整数を読み取り、この整数の長さの文字列を読み取る機能があります。
7 ビット整数形式の明確なドキュメントはありますか (MSB または LSB は、読み取るバイトがさらにあるかどうかを示し、残りのビットはデータであると大まかに理解していますが、より正確なものがあればうれしいです)。
さらに良いことにC
、この形式で数値を読み書きするための実装はありますか?
C#
'sBinaryReader
には、MSDNによると、「7ビット整数」としてエンコードされた整数を読み取り、この整数の長さの文字列を読み取る機能があります。
7 ビット整数形式の明確なドキュメントはありますか (MSB または LSB は、読み取るバイトがさらにあるかどうかを示し、残りのビットはデータであると大まかに理解していますが、より正確なものがあればうれしいです)。
さらに良いことにC
、この形式で数値を読み書きするための実装はありますか?
さて、BinaryReader.Read7BitEncodedIntのドキュメントには、値がBinaryWriter.Write7BitEncodedIntで書き込まれることが期待されており、そのメソッドのドキュメントでは形式が詳しく説明されていると既に述べています。
value パラメーターの整数は、最下位 7 ビットから開始して、一度に 7 ビットずつ書き出されます。バイトの上位ビットは、このバイトの後に書き込むバイトがあるかどうかを示します。
値が 7 ビットに収まる場合、必要なスペースは 1 バイトだけです。値が 7 ビットに収まらない場合、最上位ビットが最初のバイトに設定され、書き出されます。次に値が 7 ビットシフトされ、次のバイトが書き込まれます。このプロセスは、整数全体が書き込まれるまで繰り返されます。
したがって、バイナリ 1001011000100110011101000101101 の整数 1259551277 は、次のようにその 7 ビット形式に変換されます。
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
ただし、実際に機能する実装を提供できるほど C のスキルに自信があるわけではありません。しかし、その説明に基づいて、それを行うのはそれほど難しくありません。
この 7 ビット形式についても調査する必要がありました。私のプロジェクトの 1 つで、C# の BinaryWriter を使用していくつかのデータをファイルにパックし、それを BinaryReader で再度アンパックするとうまくいきます。
後で、このプロジェクトのパックされた Java ファイル用のリーダーも実装する必要がありました。Java には DataInputStream という名前のクラス (java.io パッケージ内) があり、これにはいくつかの類似したメソッドがあります。残念ながら、DataInputStream のデータ解釈は C# のものとは大きく異なります。
私の問題を解決するために、java.io.DataInputStream を拡張するクラスを作成して、C# の BinaryReader を Java に移植しました。これは私が書いたメソッドで、C# の 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);
}
/*
* 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;
}
形式については、http: //msdn.microsoft.com/en-us/library/system.io.binarywriter.write7bitencodedint.aspxで説明しています。
Write7BitEncodedIntメソッドには、次の説明が含まれています。各バイトの下位7ビットは、数値の次の7ビットをエンコードします。上位ビットは、次のバイトが続くときに設定されます。