動作環境
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)だけで済む点が良いです。