4

私はC#の世界に不慣れです。{abcde}{CompressedMessage} という形式のライブ フィードをキャプチャするソリューションを迅速に展開するために使用しています。ここで、{abcde} は圧縮メッセージの長さを示す 5 文字です。CompressedMessage は XCeedZip.dll を使用して圧縮されており、dll の uncompress メソッドを使用して圧縮解除する必要があります。uncompress メソッドは、成功または失敗を示す整数値を返します (ライセンスがない、解凍に失敗したなど、さまざまな種類の)。uncompress メソッドからの戻り値を参照するために、失敗 1003 http://doc.xceedsoft.com/products/XceedZip/を受け取りました。

while(true){    
byte[] receiveByte = new byte[1000];
sock.Receive(receiveByte);
string strData =System.Text.Encoding.ASCII.GetString(receiveByte,0,receiveByte.Length);
string cMesLen = strData.Substring(0,5); // length of compressed message;
string compressedMessageStr = strData.Substring(5,strData.Length-5);
byte[] compressedBytes = System.Text.Encoding.ASCII.GetBytes(compressedMessageStr);
//instantiating xceedcompression object     
XceedZipLib.XceedCompression obXCC = new XceedZipLib.XceedCompression();
obXCC.License("blah");
// uncompress method reference http://doc.xceedsoft.com/products/XceedZip/
// visual studio displays Uncompress method signature as Uncompress(ref object vaSource, out object vaUncompressed, bool bEndOfData)
object oDest;
object oSource = (object)compressedBytes;
int status = (int) obXCC.Uncompress(ref oSource, out oDest, true);
Console.WriteLine(status); /// prints 1003 http://doc.xceedsoft.com/products/XceedZip/
}                                                       

したがって、基本的に私の質問は、uncompress メソッドの呼び出しと、パラメーターを渡す正しい方法に要約されます。私は .net の世界でなじみのない領域にいるので、質問が本当に単純化されていても驚かないでしょう。

返信ありがとう..

###################################### アップデート

私は今、次のことをやっています:

int iter = 1;
int bufSize = 1024;
byte[] receiveByte = new byte[bufSize];
while (true){
  sock.Receive(receiveByte);
  //fetch compressed message length;
  int cMesLen = Convert.ToInt32(System.Text.Encoding.ASCII.GetString(receiveByte,0,5));
  byte[] cMessageByte = new byte[cMesLen];
  if (i==1){
    if (cMesLen < bufSize){
      for (int i = 5; i < 5+cMesLen; ++i){
        cMessageByte[i-5] = b[i];
      }
    }
  }
  XceedZipLib.XceedCompression obXCC = new XceedZipLib.XceedCompression();
  obXCC.License("blah");
  object oDest;
  object oSource = (object) cMessageByte;
  int status = (int) obXCC.Uncompress(ref oSource, out oDest, true);
  if (iter==1){
    byte[] testByte = objectToByteArray(oDest);
    Console.WriteLine(System.Text.Encoding.ASCII.GetString(testByte,0,testByte.Length));
  }      
}

private byte[] objectToByteArray(Object obj){
  if (obj==null){
    return null;
  }
  BinaryFormatter bf = new BinaryFormatter();
  MemoryStream ms = new MemoryStream();
  bf.Serialize(ms,obj);
  return ms.ToArray();
}

問題は、testByte writeline コマンドが意味不明な出力を出力することです。これを進める方法について何か提案はありますか?uncompress のステータス変数は良好で、現在は 0 です。

4

1 に答える 1

3

常に最初の間違いは、 の戻り値を見ていないことですReceive。読み取ったデータの量も、メッセージ全体を構成するかどうかもわかりません。

データ全体を ASCII として扱うことにより、メッセージ ペイロードを破損した可能性が高いと思われます。GetStringバッファ全体に対してa を実行するのではなく、GetString 5 バイトのみを使用するように指定して使用する必要があります。

正しいプロセス:

  • Receive少なくとも 5 バイトになるまで呼び出し(データのバッファリング、またはオフセットの増加とカウントの減少) を続けます。
  • これらの 5 バイトを処理して、ペイロードの長さを取得します
  • Receive少なくともペイロードの長さになるまで、呼び出しを続けます (データをバッファリングするか、オフセットを増やしてカウントを減らします)
  • ASCII との間で変換せずにペイロードを処理する
于 2012-07-06T06:33:00.867 に答える