バイナリとストリングについて

解決


  2005-03-15 01:10:42  No: 13762

お世話になっております。
全銀手順で固定長データを送信するプログラムを作成しています。
処理の方法なのですが、
①バイナリ型配列を定義
②SLH,TTCを作成→バイナリ配列にセット
③ReadLnで読込んだテキストファイルの内容をバイナリ配列にセット
④TCliantSocketでバイナリ型配列の送信としています。
そこで質問なのですが、
上記③ではテキストファイルの内容を1BYTEずつバイナリ型に変換してセットしています。
この部分で何か効率的な方法はないでしょうか。
また、根本の部分でもっと効率的な方法があればお教え下さい。
以上よろしくお願いします。


メラトニン  2005-03-15 04:52:45  No: 13763

外してたらすみません。
var
  f: file;
  b: byte;
begin
  AssignFile(f, 'test.txt');
  Reset(f,1);
  BlockRead(f, b, Sizeof(b));
  CloseFile(f);
end;

とあらかじめバイナリファイルとして開くのはいかがでしょうか?
Reset(),BlockRead()についてはヘルプを参照してください。


  2005-03-16 00:33:07  No: 13764

メラトニンさん書込みありがとうございます。
早速お教え頂いた方法を試してみたところ、うまくいきました。
ただ、レコードサイズ指定のブロックリードではCRLFを判断してくれないので、
CRLFを含んだレコード長(レコード長+2BYTE)の1件読みとしています。
このため、Byte型配列の末尾2バイトを省き、バッファに追加していき、伝送レコード数溜まったら伝送するという形にしました。
一方で1伝送中のレコード数は決まっているので、BlockReadで複数レコードを読み取る方法も試しましたが、
この場合も配列中からレコード分のCRLFを省いて詰めなければならず、処理的にどうなのかな??というところです。
書込んで頂いている1BYTE読込みでCRLF以外を送信バッファに溜め込むのが良いのか、いろいろ試してみたいと思います。

ちなみに、当初のループでString型を1ByteづつByte型に変換する方法よりも伝送時間は200BYTEレコード×1万件で40秒程度早くなりました。
劇的には変わりませんでしたが、改善されている??ww


  2005-03-16 00:34:07  No: 13765

ありがとうございました。


りおりお  2005-03-16 02:10:29  No: 13766

> ③ReadLnで読込んだテキストファイルの内容をバイナリ配列にセット

TStringList で読み込めば自動的に CRLF で区切られますけど。
TStringList の項目 Strings[] は String 型ですから、String 型から
byte の配列に読み込むのは、単に Move() するだけです。

procedure TForm1.Button1Click(Sender: TObject);
var
  sl: TStringList;
  i: Integer;
  ba: array of byte;
begin
  sl := TStringList.Create;
  try
    sl.LoadFromFile('c:\readme.htm');
    for i := 0 to sl.Count-1 do
    begin
      if sl[i] = '' then continue;
      SetLength(ba,Length(sl[i]));
      Move(sl[i][1],ba[0],Length(sl[i]));
      //
      // ここで ba を使う
      //
    end;
  finally
    sl.Free;
  end;
end;


りおりお  2005-03-16 02:18:09  No: 13767

上では TStringList の例を示しましたが、ReadLn で読み込んだ一行の String
型でも Move を使うのはまったくおなじです。


  2005-03-17 20:18:27  No: 13768

書き込みありがとうございます。
確かにいけましたww
この方法ならCRLFを意識しなくて良いので、処理が簡略化されます。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加