将字节数异步读取到字节数组

时间:2012-05-13 13:55:13

标签: c# bytearray stdout

我一直试图在这里使用几个教程/答案,但遗憾的是无法这样做。

我想要做的是执行一个进程,捕获它的DefaultOutput并将其添加到一个字节数组中。 到目前为止我得到的是:

private void startProcess(string path, string arguments)
{
    Process p = new Process();
    p.StartInfo.FileName = path;
    p.StartInfo.Arguments = arguments;
    p.StartInfo.UseShellExecute = false;
    p.StartInfo.CreateNoWindow = false;
    p.StartInfo.RedirectStandardOutput = true;
    p.StartInfo.RedirectStandardError = true;
    p.OutputDataReceived += p_OutputDataReceived;
    p.EnableRaisingEvents = true;
    p.Start();
    p.BeginErrorReadLine();
    p.BeginOutputReadLine();
    p.WaitForExit();
}

void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    string str = e.Data;
    // what goes here?!
}

我现在的问题是:如何将此数据添加到(增长的)字节数组中,或者是否有更适合此目的的数据类型? 另外我不知道在哪里声明这个目标字节数组,最好是在startProcess方法的某个地方,所以我可以在流程退出后继续使用数据,但是我怎么能把它传递给{{1 }}?

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以尝试使用内存流;它确实做了你想做的事。

答案 1 :(得分:1)

数组在C#中是不可变的,因此您不能拥有增长数组。这就是List<T>的用途。

如果您不关心字符编码,请执行以下操作:

List<byte> OutputData = new List<byte>(); //global

void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    string str = e.Data;
    byte[] bytes = new byte[str.Length * sizeof(char)];
    System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
    OutputData.AddRange(bytes);
}

如果您想要显式编码:

void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    string str = e.Data;
    byte[] bytes = Encoding.ASCII.GetBytes(str); //or replace ASCII with your favorite
    //encoding
    OutputData.AddRange(bytes);
}

如果您在完成后确实需要一个字节数组,只需执行:

byte[] OutputDataAry = OutputData.ToArray();

老实说,我认为List<string>会更加清晰,但你要求byte[],所以我给你一个byte[]

答案 2 :(得分:0)

如果您想立即阅读整个输出,以下代码将帮助您...

    static void Main(string[] args)
    {
        StreamReader reader;

        Process p = new Process();
        p.StartInfo.FileName = "cmd";
        p.StartInfo.Arguments = "/c echo hi";

        p.StartInfo.UseShellExecute = false;
        p.StartInfo.StandardOutputEncoding = Encoding.UTF8;
        p.StartInfo.RedirectStandardOutput = true;
        p.Start();
        reader = p.StandardOutput;

        byte[] result = Encoding.UTF8.GetBytes(reader.ReadToEnd());

        Console.WriteLine(result.ToString());
        Console.WriteLine(Encoding.UTF8.GetString(result));
        Console.ReadLine();
    }

如果不是你必须调用另一个方法而不是ReadToEnd并在线程中使用StreamReader来连续读取数据...如果你想要一个不断增长的集合,你可以使用列表或类似的东西来代替字节数组。检查同步集合与其他线程http://msdn.microsoft.com/en-us/library/ms668265(v=vs.110).aspx

的组合