質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Q&A

解決済

2回答

3861閲覧

Stream.Readで複数の値を読み取るには(Socket通信)

kousei

総合スコア14

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

0グッド

2クリップ

投稿2018/01/12 16:07

C#を使っています。

現在、Streamで送られら来るdoubleの値を以下のコードで読み取っています。

C#

1Byte[] buff = new Byte[sizeof(double)]; 2Stream.Read(buff,0,sizeof(double)); 3float val = BitConverter.ToDouble(buff, 0);

もし、Streamで送られてくる値が3つである場合、どのようにすれば読み取ることができるのでしょうか。
それとも、そもそも読み取ることができないものなのでしょうか。

理想では、MATLAB Simulink上で、
Muxブロックを使い、三つの出力されたdoubleの値を一つの信号にまとめる。
TCP/IP Sendブロックを使い、まとめた信号を指定のportから送る。
その後、送られてきた信号を、C#のScriptで読み込む。

という流れが実現できたら嬉しいと考えています。

また、このように考えたのは、現在、複数の値を一つずつ、別々のportから送っているのですが、
これだと動きが遅く、リアルタイムで値を送受信したいのにできない状況となってしまったからなのですが、
そもそも、一つのStreamにまとめてportを減らすことにより、処理は軽くなるのでしょうか。

以上、ご存知の方、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

BinaryReader を使ってください。

投稿2018/01/12 22:03

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

こんにちは。

単に3つ連続で送られてくるのであれば下記で良いと思うのですが、何か問題がでましたでしょうか?

C#

1Byte[] buff = new Byte[sizeof(double)]; 2Stream.Read(buff,0,sizeof(double)); 3float val0 = BitConverter.ToDouble(buff, 0); 4Stream.Read(buff,0,sizeof(double)); 5float val1 = BitConverter.ToDouble(buff, 0); 6Stream.Read(buff,0,sizeof(double)); 7float val2 = BitConverter.ToDouble(buff, 0);

しかし、BinaryReaderの方がお手軽そうです。Streamの外側にBinaryReaderをかぶせるだけですし。
私はBinaryReaderを使ったことはありませんが、下記イメージでいけると思います。

C#

1BinaryReader binReader = new BinaryReader(Stream); 2 : 3float val0 = binReader.ReadDouble(); 4float val1 = binReader.ReadDouble(); 5float val2 = binReader.ReadDouble();

なお、StreamをDispose()する前にbinWriterのDispose()をお忘れなく。

投稿2018/01/13 15:47

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kousei

2018/01/13 20:12

リクエストに応えていただきありがとうございます。 コードで例を書いていただいたお陰で、自分が勘違いしていたところを把握することができました。 連続でStream.Readをすると、同じ値を読み込むと勘違いしていました。 また、Streamの外側にBinaryReaderをかぶせるだけ、というのがすごくわかりやすく、おかげさまでBinaryReader,Writerを使って実装することができました。他の方からBinaryReaderを勧められ、MSDNのサンプルを参考にして試行錯誤していたのですが、変に複雑に書いてうまくいかなかったところだったので本当に助かりました。 ただ、writerとreaderのDispose()をしようとすると、”アクセスできない保護レベルになっています”と出てきてしまいます。Dispose以外のメソッドは使用できるのに、なぜこれだけアクセスできないのでしょうか。 現状、Disposeを使用しなくても問題が起こってないのでいいっちゃいいのですが、気になってしまいました。
Chironian

2018/01/14 01:31

変ですね。Dispose()はパブリックですので呼べる筈です。 https://msdn.microsoft.com/ja-jp/library/dd383354(v=vs.110).aspx もしかして、Dispose(true);みたいにbool型のパラメータを付けて呼び出してないでしょうか? private void Dispose(bool);を実装しているケースは少なくなさそうですので、そちらが呼ばれているのかも。 https://msdn.microsoft.com/ja-jp/library/b1yfkh5e(v=vs.110).aspx http://ufcpp.net/study/csharp/rm_disposable.html
kousei

2018/01/14 08:45

```C# Reader.Dispose(); ``` としか書いてないのですが,エラー内容は, void BinaryReader.Dispose(bool disposing) 'BinaryReader.Dispose(bool)'はアクセスできない保護レベルになっています. でした. 最後のURLのサイトにあるように,IDisposableとどこかに書かねばならないのでしょうか. MSDNを見た感じ,その必要はなさそうでしたが.......
Chironian

2018/01/14 12:40

変ですね。 簡単に試してみましたがコンパイルできました。 var reader = new BinaryReader(new MemoryStream()); reader.Dispose(); Visual C# 2017です。
kousei

2018/01/14 14:37

同じくVisual Studio 2017 C#で書いてみましたが,駄目でした. C#はUnityを使うために用いているのですが, using System.IOだけではだめ,もしくはusing UnityEngineを使っていると使えないなどの制約がある可能性はあるのでしょうか.(多少ググったところ,コンパイルした後にIDisposable関連でエラーが起こることはあるようですが,そもそも構文エラーとなるというようなことはなさそうでした.) 以下が全文です. using System.Collections; using System.Collections.Generic; using UnityEngine; using System.IO; public class NewBehaviourScript : MonoBehaviour { // Use this for initialization void Start () { var reader = new BinaryReader(new MemoryStream()); reader.Dispose(); } // Update is called once per frame void Update () { } }
Chironian

2018/01/14 15:17

私はUnityは使っていないので、Unityの有無の可能性は0ではないですが、考えにくいです。 一度まっさらなプロジェクトで試してみて、それにUnityを追加してみてはどうでしょう? まっさらなプロジェクトでもダメなら、Visual Studioが可笑しくなってますので、修復インストールしてみるのも手と思います。
kousei

2018/01/14 15:58

空のプロジェクトから下のプログラムを作ってみたところ,Unityに読み込ませ,スクリプトでMonoBehaviourの継承が有効になった段階で,構文エラーが発生したので.原因はUnityでした. なぜ駄目なのかはこれから調べていきます. お付き合いいただき,ありがとうございました. using System; using System.IO; using System.Collections; using System.Collections.Generic; using UnityEngine; public class binaryyyyyyy : MonoBehaviour { BinaryReader reader = new BinaryReader(new MemoryStream()); void Start() { } void Update() { } private void OnDestroy() { reader.Dispose(); } }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問