LoginSignup
0
1

More than 5 years have passed since last update.

C++ Builder XE4, 10.2 Tokyo > Indy > UDP > コマンド送信して応答を受信する > TIdUDPServerを使う例 > HEX受信版

Last updated at Posted at 2017-02-23
動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/28)

http://qiita.com/7of9/items/6391551130835372b6de
においてUDP受信するコードを記事にした。
しかしながら、上記の実装ではASCIIコード(0から127まで)しか受信できず、128から255のコードは受信失敗する (別のコードになる)。

その問題の対応を
http://qiita.com/7of9/items/94844e82e3f94898f329
にて整理していたところ、@rryuさんにコメントいただいた。

バイト列からそのまま取り出す方法はこちらでうまく実施できていなかったが、コメントを参考に再度調べてToHex()を使うという方法が見つかった。

参考 http://stackoverflow.com/questions/27167142/indy-udp-read-contents-of-adata

memo1.Lines.Add(ToHex(AData));

実装例

Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    IdUDPServer1->DefaultPort = 6000;
    IdUDPServer1->Active = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::IdUDPServer1UDPRead(TIdUDPListenerThread *AThread, const TIdBytes AData,
          TIdSocketHandle *ABinding)
{
    AnsiString rcvdStr;
    rcvdStr = ToHex(AData);

    int nop=1; // for breakpoint
}
//---------------------------------------------------------------------------

以上によりAAA<E2>で送信されたコードは414141E2として文字化けしないで受信できた。

この送受信においては、BCD変換のような通信データサイズ増加はなく、受信側だけの変換(例: 41から0x41)だけで済む点が良いです。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1