作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 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 个字节Receive
(缓冲数据,或增加偏移量并减少计数),直到您至少拥有有效负载长度关于C# 套接字消息解压,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11356855/
我是一名优秀的程序员,十分优秀!