从networkStream对象读取二进制数据时出现问题

问题描述 投票:0回答:1

关于我需要从连接到某些测量设备的 SCPI Lan 获取二进制数据, 首先我尝试使用像这样的

StreamReader
对象:

public async Task<string> Transmit ()
{
    IPAddress ipAddress = new IPAddress(new byte[] { 192, 168, 0, 21 });
    TcpClient client = new TcpClient();

    await client.ConnectAsync(ipAddress, 5555); // Connect

    NetworkStream networkStream = client.GetStream();
    StreamWriter writer = new StreamWriter(networkStream);
    StreamReader reader = new StreamReader(networkStream);

    writer.AutoFlush = true;
    
    //SEND Command to Machine
    await writer.WriteLineAsync("WAV:READ?" + "\n");

    //Receive Data from Machine
    string respond= await reader.ReadLineAsync();

    return respond;
}

它工作正常,但问题是实际数据以二进制格式发送,正如我发现

StreamReader
无法处理二进制数据,我也尝试更改不同的Unicode,例如
UTF8
,并且所有大于127的数据再次更改为65536当我尝试通过以下方式将字符串转换为二进制时:

byte[] RawData = System.Text.Encoding.ASCII.GetBytes(data);

所以我尝试使用不支持

BinaryReader
asyncRead
,所以我尝试通过检查
DataAvailable
对象中的
networkSteam
属性来使用轮询方法,如下所示:

//...
 while (true)
    {
        if (networkStream.DataAvailable)
        {
            byte b = binaryReader.ReadByte();
            //.. do grabbing data and find EOP by dispatching data packet 
            //.. size could varies 
            //.. if(EOP)
            //.. {
            //..     break;
            //.. }
        }
    }

但是

networkStream.DataAvailable
永远不会变成 true ,即使不检查
binaryReader.ReadByte()
属性,我也没有机会从
DataAvailable
获取任何字节。

对于我的项目来说,支持

async
方法也很重要,而
binaryReader
似乎不支持;

我的代码在.NetFramework 4.6下运行。

请问有人有什么建议可以帮助我解决我的问题吗?

c# sockets async-await .net-framework-version networkstream
1个回答
0
投票

正如评论中已经指出的:忘记

StreamReader
/
StreamWriter
;它们用于文本,而您不是在阅读(纯)文本。您将需要直接使用
Stream
API(特别是
ReadAsync
WriteAsync
),并自行处理其余部分;特别是,在阅读时,您通常会使用读缓冲区,并且需要处理尚未使用的数据的后台缓冲区、检测单个块/帧等。处理文本时子数据,Encoding发挥作用。
    

© www.soinside.com 2019 - 2024. All rights reserved.