Cna*_*eak 5 .net c# http stream
我有一个基本流,它是HTTP请求流和
var s=new HttpListener().GetContext().Request.InputStream;
Run Code Online (Sandbox Code Playgroud)
我想读取流(包含非字符内容,因为我发送了数据包)
当我们通过StreamReader包装此流时,我们使用StreamReader的ReadToEnd()函数,它可以读取整个流并返回一个字符串...
HttpListener listener = new HttpListener();
listener.Prefixes.Add("http://127.0.0.1/");
listener.Start();
var context = listener.GetContext();
var sr = new StreamReader(context.Request.InputStream);
string x=sr.ReadToEnd(); //This Workds
Run Code Online (Sandbox Code Playgroud)
但由于它有非字符内容我们不能使用StremReader(我尝试了所有编码机制..使用字符串是错误的.)我不能使用该功能
context.Request.InputStream.Read(buffer,position,Len)
Run Code Online (Sandbox Code Playgroud)
因为我无法得到流的长度,InputStream.Length总是抛出一个异常而且无法使用..而且我不想创建像[size] [file]这样的小协议,然后读取第一个大小然后文件......不知何故StreamReader可以获得长度..我只是想知道如何.我也尝试了这个并没有用
List<byte> bb = new List<byte>();
var ss = context.Request.InputStream;
byte b = (byte)ss.ReadByte();
while (b >= 0)
{
bb.Add(b);
b = (byte)ss.ReadByte();
}
Run Code Online (Sandbox Code Playgroud)
我通过以下方式解决了这个问题
FileStream fs = new FileStream("C:\\cygwin\\home\\Dff.rar", FileMode.Create);
byte[] file = new byte[1024 * 1024];
int finishedBytes = ss.Read(file, 0, file.Length);
while (finishedBytes > 0)
{
fs.Write(file, 0, finishedBytes);
finishedBytes = ss.Read(file, 0, file.Length);
}
fs.Close();
Run Code Online (Sandbox Code Playgroud)
谢谢乔恩,道格拉斯
您的错误在于以下行:
byte b = (byte)ss.ReadByte();
Run Code Online (Sandbox Code Playgroud)
的byte类型是无符号; 当Stream.ReadByte在流的末尾返回-1时,你不加选择地将它byte转换为,将其转换为255,因此满足b >= 0条件.值得注意的是,返回类型int不是byte出于这个原因.
对代码进行快速修复:
List<byte> bb = new List<byte>();
var ss = context.Request.InputStream;
int next = ss.ReadByte();
while (next != -1)
{
bb.Add((byte)next);
next = ss.ReadByte();
}
Run Code Online (Sandbox Code Playgroud)
以下解决方案更有效,因为它避免了ReadByte调用引起的逐字节读取,并且使用动态扩展的字节数组来Read代替调用(类似于List<T>内部实现的方式):
var ss = context.Request.InputStream;
byte[] buffer = new byte[1024];
int totalCount = 0;
while (true)
{
int currentCount = ss.Read(buffer, totalCount, buffer.Length - totalCount);
if (currentCount == 0)
break;
totalCount += currentCount;
if (totalCount == buffer.Length)
Array.Resize(ref buffer, buffer.Length * 2);
}
Array.Resize(ref buffer, totalCount);
Run Code Online (Sandbox Code Playgroud)
StreamReader不能得到长度 - 似乎有关于第三个参数的一些混乱Stream.Read.该参数指定将要读取的最大字节数,它不需要(实际上不能)等于流中实际可用的字节数.您只需调用Read一个循环直到它返回0,在这种情况下,您知道已到达流的末尾.这些都记录在MSDN上,它也是如何StreamReader做到的.
阅读请求StreamReader并获取请求也没有问题string; 字符串在.NET中是二进制安全的,所以你被覆盖了.问题将是理解字符串的内容,但我们无法真正谈论这一点,因为您没有提供任何相关信息.
| 归档时间: |
|
| 查看次数: |
7086 次 |
| 最近记录: |