我正在测试BinaryFormatter,看看它对我有用,我有一个简单的问题:
当它与字符串HELLO一起使用时,我将MemoryStream转换为数组,它给出了29个维度,其中五个是维度末尾的实际数据:
BinaryFormatter bf = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
byte[] bytes;
string originalData = "HELLO";
bf.Serialize(ms, originalData);
ms.Seek(0, 0);
bytes = ms.ToArray();
Run Code Online (Sandbox Code Playgroud)
回报
- bytes {Dimensions:[29]} byte[]
[0] 0 byte
[1] 1 byte
[2] 0 byte
[3] 0 byte
[4] 0 byte
[5] 255 byte
[6] 255 byte
[7] 255 byte
[8] 255 byte
[9] 1 byte
[10] 0 byte
[11] 0 byte
[12] 0 byte
[13] 0 byte
[14] 0 byte
[15] 0 byte
[16] 0 …Run Code Online (Sandbox Code Playgroud) 由于MemoryStream是一个非托管资源,它总是必须处理?
鉴于:
1) A method is invoked.
2) A MemoryStream object is created (MemoryStream ms = new MemoryStream();).
3) An exception occurs and is caught from the invoking classes.
Run Code Online (Sandbox Code Playgroud)
因此,MemoryStream对象上的引用将丢失.这种情况需要try/finally-block(或using语句)吗?
我的代码是这样的:
byte[] byteArray = Encoding.ASCII.GetBytes(someText);
MemoryStream stream = new MemoryStream(byteArray);
StreamReader reader = new StreamReader(stream);
FileStream file = (FileStream)reader.BaseStream;
Run Code Online (Sandbox Code Playgroud)
后来我正在使用file.Name.
我收到一个InvalidCastException:它显示如下
无法将类型为"System.IO.MemoryStream"的对象强制转换为"System.IO.FileStream".
我在某处读到了我应该将FileStream更改为Stream.还有什么我应该做的吗?
在Delphi中,可以执行以下操作:
var
ms : TMemoryStream;
i : Integer;
begin
ms := TMemoryStream.Create;
i := 1024;
ms.Write(@i, SizeOf(Integer));
ms.Free;
end;
Run Code Online (Sandbox Code Playgroud)
这会将i的内存内容写入ms.
MemoryNet的.Net版本没有这样的功能(托管版本和非托管版本).我知道.Net在这方面与Delphi的原理不同.
如何在C#中做到这一点?我对"最佳实践"和最快的方法感兴趣.
我正在使用MemoryStream来构造我需要发送到服务器的字节数组.我有以下问题:
1)有没有比这更好的方法来构造一个字节数组?
2)为什么这些代码会在我的内存流中写出伪造的?
var
serial : word;
MS : TMemoryStream;
const
somebytes : array [0..1] of byte = ($72,$72);
...
begin
MS := TMemoryStream.Create();
try
MS.Write(somebytes[0],2);
serial := $3E6C;
MS.Write(serial,2);
finally
MS.Free;
end;
Run Code Online (Sandbox Code Playgroud)
使用调试器,我看到在流中添加了值$ 6F32而不是$ 3E6C.
3)如果我打电话
MS.Position := 2;
Run Code Online (Sandbox Code Playgroud)
然后我访问PByte(MS.Memory)^为什么我得到流中的第一个字节而不是第三个字节?
我想将一个给定float转换为二进制表示.我试图将浮点值写入a MemoryStream,MemoryStream逐字节读取该字节并将字节转换为其二进制表示.但每次尝试都失败了.
MemoryStream,当我没有刷新时为0 的长度,而当我做的时StreamWriter,为1.我确信有一种更好的方法可以将floats 转换为二进制,但我也想了解一下这个MemoryStream类.
我一直想知道Stream在C#.Net中使用类的最佳实践是什么.提供已写入或提供的流是否更好?即:
public Stream DoStuff(...)
{
var retStream = new MemoryStream();
//Write to retStream
return retStream;
}
Run Code Online (Sandbox Code Playgroud)
而不是;
public void DoStuff(Stream myStream, ...)
{
//write to myStream directly
}
Run Code Online (Sandbox Code Playgroud)
为了生命周期控制,我总是使用前一个例子,但我有这种感觉,Stream因为缺少一个更好的词,这是一种"流式传输"的糟糕方式.
我已经尝试将json格式的数据检索为字符串并将其写入文件,并且效果很好.现在我正在尝试使用MemoryStream来做同样的事情,但没有任何东西被写入文件 - 仅仅是[{},{},{},{},{}]而没有任何实际数据.
我的问题是 - 如何检查数据是否确实正确地进入内存流,或者问题是否发生在其他地方.我知道myList确实包含数据.
这是我的代码:
MemoryStream ms = new MemoryStream();
DataContractJsonSerializer dcjs = new DataContractJsonSerializer(typeof(List<myClass>));
dcjs.WriteObject(ms, myList);
using (FileStream fs = new FileStream(Path.Combine(Application.StartupPath,"MyFile.json"), FileMode.OpenOrCreate))
{
ms.Position = 0;
ms.Read(ms.ToArray(), 0, (int)ms.Length);
fs.Write(ms.ToArray(), 0, ms.ToArray().Length);
ms.Close();
fs.Flush();
fs.Close();
}
Run Code Online (Sandbox Code Playgroud) 我试图将两个PDF文件读入两个内存流,然后返回一个包含两个流数据的流.但我似乎不明白我的代码有什么问题.
示例代码:
string file1Path = "Sampl1.pdf";
string file2Path = "Sample2.pdf";
MemoryStream stream1 = new MemoryStream(File.ReadAllBytes(file1Path));
MemoryStream stream2 = new MemoryStream(File.ReadAllBytes(file2Path));
stream1.Position = 0;
stream1.Copyto(stream2);
return stream2; /*supposed to be containing data of both stream1 and stream2 but contains data of stream1 only*/
Run Code Online (Sandbox Code Playgroud) 我试图使用以下代码将zip文件从asp.net web api返回给客户端:
private byte[] CreateZip(string data)
{
using (var ms = new MemoryStream())
{
using (var ar = new ZipArchive(ms, ZipArchiveMode.Create, true))
{
var file = archive.CreateEntry("file.html");
using (var entryStream = file.Open())
using (var sw = new StreamWriter(entryStream))
{
sw .Write(value);
}
}
return memoryStream.ToArray();
}
}
public HttpResponseMessage Post([FromBody] string data)
{
HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
result.Content = new ByteArrayContent(CreateZip(data));
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip, application/octet-stream");
return result;
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,我收到以下错误:
ExceptionMessage":"值'application/zip,application/octet-stream'的格式无效."
这是JS代码:
$.ajax({
type: "POST",
url: url,
data: …Run Code Online (Sandbox Code Playgroud) memorystream ×10
c# ×8
.net ×3
stream ×2
ajax ×1
binary ×1
c#-4.0 ×1
delphi ×1
dispose ×1
filestream ×1
itextsharp ×1
json ×1
ziparchive ×1