私はboost::asio
を使ってTCPクライアントを書いています。私はバイナリ表現で浮動小数点数の配列を送信したいです。 boostはboost :: arrayなどで配置するためのバイナリ表現にデータを変換する良い方法を提供していますか?boost :: asioを使って生のバイナリデータを送る方法
私は過去にQt QDataStream
を使用していました。私はブーストに何か同等のものがあると確信している
私はboost::asio
を使ってTCPクライアントを書いています。私はバイナリ表現で浮動小数点数の配列を送信したいです。 boostはboost :: arrayなどで配置するためのバイナリ表現にデータを変換する良い方法を提供していますか?boost :: asioを使って生のバイナリデータを送る方法
私は過去にQt QDataStream
を使用していました。私はブーストに何か同等のものがあると確信している
#include <boost/asio.hpp>
#include <boost/foreach.hpp>
#include <boost/lexical_cast.hpp>
#include <iostream>
int
main(unsigned argc, char** argv)
{
if (argc < 3) {
std::cerr << "usage: " << argv[0] << " host port" << std::endl;
exit(EXIT_FAILURE);
}
boost::array<float, 5> foo = {1.0, 2.0, 3.0, 4.0, 5.0};
BOOST_FOREACH(const float i, foo) {
std::cout << i << std::endl;
}
boost::asio::io_service ios;
boost::asio::ip::tcp::socket socket(ios);
socket.connect(
boost::asio::ip::tcp::endpoint(
boost::asio::ip::address::from_string(argv[1]),
boost::lexical_cast<unsigned>(argv[2])
)
);
const size_t bytes = boost::asio::write(
socket,
boost::asio::buffer(foo)
);
std::cout << "sent " << bytes << " bytes" << std::endl;
}
応答のための
bash-3.2$ g++ -I /opt/local/include -L/opt/local/lib -lboost_system -Wl,-rpath,/opt/local/lib array.cc
実行
bash-3.2$ ./a.out 127.0.0.1 1234
1
2
3
4
5
sent 20 bytes
bash-3.2$
サーバー
bash-3.2$ nc -l 1234 | hexdump -b
0000000 000 000 200 077 000 000 000 100 000 000 100 100 000 000 200 100
0000010 000 000 240 100
0000014
bash-3.2$
あなたは、ファイルへのデータの任意の並べ替えを書くことができると同じように、ASIOを介してデータの任意の並べ替えを送ることができます。
T x; // anything
const char * px = reinterpret_cast<const char*>(&x); // no type punning, cast-to-char is allowed
boost::asio::async_write(my_socket, boost::asio::buffer(px, sizeof(T)), ...
それとも単にファイルへの書き込み:任意の鋳造
std::ofstream f("data.bin");
f.write(px, sizeof(T));
変数をchar*
にすることは、バイナリデータをファイルやソケットなどにシリアル化できる必要があるため、おそらく標準によって明示的に許可されています。
感謝をコンパイルします。私はchar *へのキャストを理解していますが、それを行うための適切なC++の方法を見てうれしいです。これをどのように配列に拡張すればよいですか?これは、各フロートをchar *にキャストし、その4バイト(または何でも)をメッセージバッファに追加するという、反復処理のプロセスですか?私はこれが基本的な質問のように思えますが、私は正しい方法でそれをやっていることを確認したかったのです。 – Gareth
もしそれが裸のC配列であれば、C配列がメモリに連続して格納されているので、 '&x [0]'を 'char *'にキャストし、サイズを 'sizeof(T)'に配列長を掛けた値にする必要があります。 –
ありがとう、これは役に立ちます。 1つの質問 - メッセージの先頭にintを付加したいとします(どのフロートが何回フォローしているかを示すため)。これはどのように行われますか? – Gareth