LoginSignup
6
1

More than 3 years have passed since last update.

Mindによるバイナリ操作

Last updated at Posted at 2019-12-23

はじめに

ある日、私はMindでバイナリをファイルに書き込もうとしていましたが、悪戦苦闘しました。Mindでは中々バイナリをうまく扱えないので...なら、自ら関数を作ればいいじゃない!ということで作ってみました。後進(そんな人いるのか?)の方々の参考になれば幸いです。
本記事では、バイナリの基本的な操作や、変換の方法について扱います。

Mindでのバイナリの概念

Mindでは、バイナリを文字列として扱います。一バイト辺りおおよそ一文字のように扱い、通常の文字列操作単語が使用できます。しかし、Mindは文字列を論理的な文字の集まりとしてみなす単語も多いため、そのような介入がない代替単語を使用するように注意が必要です。

Mindでの定数バイナリ

Mindで、定数としてのバイナリは以下のように書きます。

バイナリ定数は 文字列

※単行の場合
{12 34 56 78}を バイナリ定数に 入れ、

※複行の場合
{12 34 56 78}C
{9A BC DE F0}を バイナリ定数に 入れ、

※「{」でも「{」でも同じ。ただしそろえる必要はある。数字も半角全角は等しいものとして処理される。
「{」から「}」の中に、一バイトずつ情報を空白で区切って十六進数で書きます。このようにして書かれたバイナリは文字列として扱われます。

16進数を数値で書く

Mindで整数を16進数で表記したい場合は以下のように書きます。

十六進数データは 変数

※通常の数字(0-9)から始まる場合
99Hを 十六進数データに 入れ

※アルファベット(A-F)から始まる場合
0FFHを 十六進数データに 入れ

※通常の数字から始まる場合も0から始めてよい。数字やアルファベットは半角全角は等しいものとして処理される。
十六進数で数値を書いた後、最後に「H」を書くことで十六進数として認識されます。アルファベットで始まる場合は、必ず最初を「0」としてください。また、整数は4バイトまでしか扱えないことも重要です。それ以上の操作をしたい場合、他の方法を使用する必要があります。

シフト

Mindにも標準でシフト単語が用意されており、以下のように使用することができます。

※左シフト
0FFHを 8ビット 左シフトし ※0FF00H

※右シフト
0FF00Hを 8ビット 右シフトし ※0FFH

「左シフト」・「右シフト」はそれぞれ指定されたビット数だけ数値をシフトします。なお、Mindは数助詞を解釈しない為、「8ビット」の部分を「1バイト」と置き換えても、1ビットだけシフトしてしまいます。1バイトは8ビットなので、8ビット単位でのシフトが多いのではないでしょうか。

本題(数値をバイナリとして文字列に変換する)

これまでの方法では、「定数しか扱えない」や「全体で4バイトまで」という制約があります。これを突破するには数値をバイナリとして文字列に変換する方法が考えられます。例えば以下のような方法です。

変換後文字列は 文字列実体 長さ 4バイト。
(数値・バイト数ー>文字列)
バイト数指定で文字列化とは
    受け取り数は 変数
    繰り返し数は 変数
    操作桁数は 変数
    マスク値は 変数

    変換後文字列を クリアし
    受け取り数と 繰り返し数に 入れ
    繰り返し数を 回数指定して
        回数を 繰り返し数から 引いて、8ビットを 掛けて、 操作桁数に 入れ、

        操作桁数ぶんだけ、1を 左シフトしたものを マスク値に 入れ、

        7を 回数指定して
            マスク値を 1つだけ 左シフトしたものと、マスク値の ORを マスク値に 入れることを
        繰り返す

        マスク値と 受け取り数の ANDを
        操作桁数だけ 右シフトし 変換後文字列に 一文字追加して、
    繰り返し、
    変換後文字列を 返すこと。

※返り値である文字列はすぐに使用するか文字列実体変数に格納すること。
※「変換後文字列」をローカル変数として定義すると、変数の有効期限の関係により、中身が破壊される可能性がある。
これは単に1バイト分ずつ数値を切り取って、それぞれを文字として文字列実体変数に一文字ずつ追加しています。
このように文字列に変換すれば、「4バイトまで」という制約を無視し、どんどん追加していけます。
例えば以下のように:

メインとは
  バイナリ文字列は 文字列実体 長さ 50桁
  バイナリ文字列を クリアし
  12345678Hを 4バイトで バイト数指定で文字列化し
  バイナリ文字列に 追加し
  9ABCDEF0Hを 4バイトで バイト数指定で文字列化し
  バイナリ文字列に 追加し。

ファイル書き込み

詳しい解説はMindのドキュメントに任せますが、ファイル書き込みは以下のようにできます。

メインとは
  書き込み先は ファイル
  「Hello.dat」で 書き込み先を 新規オープンし
  ※エラー処理を省略
  ※バイナリを文字列で書き込み
  {0C AA 3F 46}を 書き込み先に 書き込み、
  ※バイナリを数値で書き込み
  0CAA3F46Hを 書き込み先に 書き込み、
  書き込み先を クローズし。

数値も文字列も同じように書き込んでくれますので、割と自由に書き込めると思います。しかし、可能な限り短く書き込むので、例えば「00FFHを 書き込み先に 書き込み」としても一バイトしか書き込まれないことには注意が必要です。(文字列に変換すれば、必ず書き込んでくれます。)

おわりに

これで一応バイナリ操作やバイナリのファイル書き込みなどができるようになったと思います。これでいろんなバイナリ操作ができますね!

6
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
6
1