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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

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

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

3579閲覧

C#のコードをC/C++に書き換えたい

tshu_m421

総合スコア5

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

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

UDP

UDP(User Datagram Protocol)とは、トランスポート層のプロトコルであり、コネクション型のデータサービスです。IPネットワーク上の別のホストにコンピュータのアプリケーションがメッセージを送ることができ、転送チャンネルやデータ経路を設定する必要はありません。TCPに比べて高速であるが、信頼性が薄いという特徴があります。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/06/18 04:37

編集2021/06/18 11:01

前提・実現したいこと

初めての質問ですので、不備があるかもしれませんが、よろしくお願いいたします。
また、C#,C/C++どちらも初心者です。

現在、ある計測装置からUDPで送られるバイト型のデータをdouble型のデータに変換したいと思っています。

###質問の内容
特にC#のBitConverter.ToDouble メソッドを用いたコードをC/C++でも実現したいです。

発生している問題・エラーメッセージ

計測装置側のソフトウェアで表示される値とこちらのプログラム側で出力される値が異ってしまいます。
問題となっている値は2つで、それぞれx,yとすると以下のような感じの出力になります。

例:
計測装置側
x = 0.22315
y = -0.56878

プログラム側
x = 0.00000
y = 65464562132132165498.00000

これらの値以外にもバイト型のデータを整数型に変換した値もありますが、こちらの方は計測装置側とプログラム側の出力値が一致したので、恐らくUDP通信に問題はないと思われます。
また、下に示すC#のコードは自分が実装したものではありませんが、実装した人曰くx、yの値は計測装置側とプログラム側で一致するらしいので、恐らくバイト型配列の取得位置も問題ないと思います。
従って、C#のBitConverter.ToDouble メソッドを用いたコードに対応するであろうc/c++でのバイト型配列のdouble型変換にエラーがあると思われます。
2つの値x,yはどちらも同じ処理を行います。

該当のソースコード

C#

1 2byte[] data = udp.Receive(ref remoteEP); 3byte[] fuga1 = { data[7], data[6], data[5], data[4], data[3], data[2], data[1], data[0] }; 4byte[] fuga2 = { data[15], data[14], data[13], data[12], data[11], data[10], data[9], data[8] }; 5double x = BitConverter.ToDouble(fuga1, 0); 6double y = BitConverter.ToDouble(fuga2, 0);

C

1byte data[20]; 2NetWorkRecvUDP(NetUDPHandle, NULL, NULL, Data, sizeof(Data), FALSE); #dxライブラリ関数使用 3byte fuga1[] = { data[7], data[6], data[5], data[4], data[3], data[2], data[1], data[0] }; 4byte fuga2[] = { data[15], data[14], data[13], data[12], data[11], data[10], data[9], data[8] }; 5 6/// 7memcpy(&x, fuga1, sizeof(fuga1)); 8memcpy(&y, fuga2, sizeof(fuga2)); 9/// 10 11/// 12double x = *(double*)&fuga1; 13double y = *(double*)&fuga2; 14///

試したこと

いくつかのサイトを参考にして記述した、C/C++の///ソースコード///で示したのを両方試しましたが、ダメでした。。。

補足情報(FW/ツールのバージョンなど)

開発環境 VisualStudio2019
言語   C/C++

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

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

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

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

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

guest

回答4

0

byte[] fuga1 = { data[7], data[6], data[5], data[4], data[3], data[2], data[1], data[0] };

C言語の文法になってませんね

投稿2021/06/18 04:50

y_waiwai

総合スコア87774

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

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

tshu_m421

2021/06/18 05:54

すみません。 指摘されるまで気づきませんでした。。。 C#のコードを間違ってそのままCの方にも載せていました。 実際のプログラムでは、Cの記法になっています。 また、質問の方も修正しました。
y_waiwai

2021/06/18 10:30

いまだCにはなってません。 エラーが出ると思うけど。
tshu_m421

2021/06/18 11:02

恐縮ですが、Cになっていない部分がわかりません。。。
pepperleaf

2021/06/18 11:44

昔のCだとダメっぽいけど、Visual Studio 2019 だと エラーならない。 他はちょっと不明。
Bull

2021/06/18 13:06

DXライブラリを使用しているようなので、おそらく C ではなく C++ でしょうか。
tshu_m421

2021/06/19 13:04

すみません。 DXライブラリを使用しているので、C++ですね。 細かい分別をつけずに書いていました。
guest

0

自己解決

回答してくださった方、ありがとうございました。
色々試行錯誤してみましたが、結局、バイト型配列の中身が違っていたことが原因でした。
また、BitConverter.ToDoubleメソッドに対応するコードも、記載した方法で大丈夫でした。

また、初めての質問ということもあり、質問に不備が多くありました。
すみませんでした。
反省します。。。。

改めて、ありがとうございました。

投稿2021/06/19 13:07

tshu_m421

総合スコア5

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

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

0

C# で

C#

1 double x = 0.22315; 2 double y = -0.56878; 3 4 byte[] byteX = BitConverter.GetBytes(x); 5 byte[] byteY = BitConverter.GetBytes(y); 6 7 Console.WriteLine($"x = {x}, {BitConverter.ToString(byteX)}"); 8 Console.WriteLine($"y = {y}, {BitConverter.ToString(byteY)}");

として得られた値を Cで入力

C

1#define byte unsigned char // 追記 忘れてた。 2 3 byte fuga1[] = { 0x71, 0x1B, 0x0D, 0xE0, 0x2D, 0x90, 0xCC, 0x3F}; 4 byte fuga2[] = { 0xDD, 0xCD, 0x53, 0x1D, 0x72, 0x33, 0xE2, 0xBF}; 5 /// 6 double x = *(double*)&fuga1; 7 double y = *(double*)&fuga2; 8 /// 9 printf("x = %lf\n", x); 10 printf("y = %lf\n", y);
x = 0.223150 y = -0.568780

一致するようです。

別の問題では?

投稿2021/06/18 12:17

編集2021/06/19 00:41
pepperleaf

総合スコア6383

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

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

0

計測装置側からどんな値が送られたのかがわかるのであれば,

それを受信したときの data[] の中身をチェックするところから初めてみてはどうでしょう.
そのときの中身と,

C++

1//比較用テスト 2double X = 計測装置から送られたはずの値; 3byte Array[ sizeof(double) ]; 4memcpy( Array, &X, sizeof(double) ); 5 6//これはXと一致するよね,きっと 7double Y = *(double*)Array;

としたときの Array[] の中身が一致しているのか? という.

投稿2021/06/18 05:05

編集2021/06/18 05:08
fana

総合スコア11658

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

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

tshu_m421

2021/06/18 06:22

こちらの方も、確認してやってみたいと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問