gpt4 book ai didi

C# 套接字消息解压

转载 作者:行者123 更新时间:2023-11-30 12:13:38 24 4
gpt4 key购买 nike

我是 C# 世界的新手。我用它来快速部署一个解决方案来捕获以这种形式出现的实时提要(为清楚起见,大括号):{abcde}{CompressedMessage},其中 {abcde} 由 5 个字符组成,表示压缩消息的长度。 CompressedMessage是使用XCeedZip.dll压缩的,需要使用dll的uncompress方法解压。 uncompress 方法返回一个整数值,指示成功或失败(各种类型,例如,无许可失败、解压缩失败等)。我收到失败 1003 http://doc.xceedsoft.com/products/XceedZip/用于 uncompress 方法返回值的引用。

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/
}

所以基本上我的问题归结为解压缩方法的调用和传递参数的正确方法。我在 .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。

最佳答案

第一个错误总是没有查看Receive 的返回值;您不知道您刚刚读取了多少数据,也不知道它是否构成了一条完整的消息。

在我看来,您可能通过将整个数据视为 ASCII 来破坏消息负载。与其对整个缓冲区执行 GetString,不如使用 GetString 指定仅使用 5 个字节

正确的流程:

  • 继续调用Receive(缓冲数据,或增加偏移量并减少计数)直到至少有 5 个字节
  • 处理这 5 个字节以获得负载长度
  • 继续调用Receive(缓冲数据,或增加偏移量并减少计数),直到您至少拥有有效负载长度
  • 在不转换为 ASCII 或从 ASCII 转换的情况下处理负载

关于C# 套接字消息解压,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11356855/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com