16進のデータをテキストファイルに出力するには?

解決


あこ  2004-10-18 22:21:12  No: 117034

こんにちは。お世話になります。
基本的な事なのかもしれないのですが・・
16進のデータ(具体的には「1A」というものなのですが・・)を
テキストファイルに出力する方法を教えて下さい(_ _)
よろしくお願いいたします。

環境はvb6.0です。


ABC  2004-10-18 23:33:16  No: 117035

テキストファイルに「1A」(バイナリだと[31],[41])という文字を出力したいのでしょうか
それともバイナリの[1A]という値を出力したいのでしょうか。(これだとテキストファイルに
という言葉は不適切ですが)

前者であればHex関数を用いることで文字列に変換してくれます。
後者の場合はそのままPutで書き込めばいいでしょう。


あこ  2004-10-19 01:27:45  No: 117036

不適切な説明ですみませんでした。

たぶん、バイナリの「1A」という値を出力したいです。
テキストファイルをバイナリィエディタを使用して
データを確認した時に、「1A」というデータが最後に入っていたので
それと同じファイルを下のロジックを使用して
VBより作成したいのですが・・。

    Dim s_FileName As String '書き込むファイル名
    Dim FileFree As Integer
    
    s_FileName = ps_OUT_FILE_AaaPath '書き込むファイル名を取得
    FileFree = FreeFile '空いているファイル番号を取得
    
    'テキストファイルを開く    '追加書き込み
    Open s_FileName For Append As FileFree
    
    ’ここにA1というデータを固定で出力したいのですが・・(これですと、失敗しております。)
    Print #FileFree, Hex(1A);
    
    Close FileFree


マグ  2004-10-19 01:29:18  No: 117037

そして、プログラムで作る場合は・・・・・

JavaScript & HTMLのソースですけど、

===========10進数から16進数に変換================

<html>
<script language="javascript">
<!--
function dousa() {
    var nn = eval(document.form1.text1.value);
//      var nn = parseInt(document.myform.text1.value);
              //入力文字列を10進数の数字に変換
  //  var m10=nn;
    var n16=0;              
    var ans ="";            //余りを文字列で結合し、16進数文字列を格納
    while (nn > 0) {
  n16=nn%16;        //16で割った余りを格納する変数
        nn=(nn-n16)/16;  //16で割った商(整数)
        ans=bunrui(n16) + ans;      //余りを文字列で結合し、16進数文字列を格納
    }
   document.form1.text2.value = ans;
//   document.myform.text2.value = "10進数 " + m10 + " の16進数は " + ans;
}
function bunrui(n) {
  switch (n) {
    case 10: n="A"; break;  //余りが10以上の場合の16進数
    case 11: n="B"; break;
    case 12: n="C"; break;
    case 13: n="D"; break;
    case 14: n="E"; break;
    case 15: n="F"; break;
  }
        return n;
}
//-->
</script>
<FORM name="form1"><PRE>
 10進数を入力ください:<INPUT TYPE="text" name="text1" size=20> <INPUT TYPE="button" VALUE="変換" onClick="dousa()">
 変換した16進数の表示:<INPUT TYPE="text" name="text2" size=20>
</PRE></FORM>
</html>

==================16進数から10進数に変換========================-

<html>
<script language="javascript">
<!--
//定義
var mozi;
var souko;
var data;
var sansyutu=0;
//データを配列に格納
my=new Array();
my["0"]=0;
my["1"]=1;
my["2"]=2;
my["3"]=3;
my["4"]=4;
my["5"]=5;
my["6"]=6;
my["7"]=7;
my["8"]=8;
my["9"]=9;
my["A"]=10;
my["B"]=11;
my["C"]=12;
my["D"]=13;
my["E"]=14;
my["F"]=15;
my["a"]=10;
my["b"]=11;
my["c"]=12;
my["d"]=13;
my["e"]=14;
my["f"]=15;
function henkan(SYUTOKU)
{
  //値の初期化
  sansyutu=0;
  souko=0;
  data=0;
  //変数moziに10進数に変える16進数の文字コードを入れてください。
  mozi=SYUTOKU.text1.value
  //取得した文字列をそれぞれ一文字ずつカットする。
  /*************ここから*****************/
  for (i=0;i<mozi.length;i++)
  {
    //文字をカットして、dataにいれる。
    data=mozi.substring(i,i+1);
    //取得した一文字が16進数かどうかを調べる。
    if (data.match(/[0-9]/) || data.match(/[A-F]/) || data.match(/[a-f]/)){}
    else
    {
      alert('16進数で無効なデータです。');
      return 0;
    }
    //データ、16進数から10進数に変換させる計算。
    souko=mozi.length-i-1;
    sansyutu +=(my[data]*(Math.pow(16,souko)))
  }
  /*************ここまで*****************/
  //指定したテキストに出力
  SYUTOKU.kekka.value=sansyutu;
}
//-->
</script>
<form name="form1">
<input type="text" value="" name="text1">
<input type="button" value="変換" onclick="henkan(this.form);"><br>
<input type="text" value="" name="kekka">
</form>
</html>

です。
10進数←→16進数の相互変換が出来ます。
後に関数の存在を知って、完成後から・・・わずか、1分で水の泡になりました。(TT)


マグ  2004-10-19 01:31:23  No: 117038

文章を打ってる間に投票があったみたい。

っということで、質問内容と回答が違いました。


特攻隊長まるるう  2004-10-19 01:50:41  No: 117039

あこさんへ
ABCさんが
>後者の場合はそのままPutで書き込めばいいでしょう。
というヒントをくれてるんですから、過去ログ検索『Put』
でバイナリでデータを読んだり書いたりしてる書き込みを
調べるくらいはしましょう。
1から10まで回答者に求めないようにしましょう。


あこ  2004-10-19 03:27:41  No: 117040

特攻隊長まるるうさま 
大変失礼いたしました。。
こちらのページで「put」で検索はしたのですが・・思うような
情報が得られなくて そのまま書いてしまいました。
先程、実験的にバイナリで PUT 書き込みをしてみたりしたのですが・・
追加書込み および データの変換も上手く行かないのです。

データもHEX関数を使用して書込みを試みたのですが 
HEXの'1A'データを
使用方法をあやまっているのか・・そのまま「1A」書き込まれております。
本当に申し訳ないのですが・・
16進データのをファイルへ追加書込みできるか教えて下さいm(_ _;;)m
それか、VBリファレンスの参照場所などでも かまいませんので
よろしくお願いいたします。


ガッ  2004-10-19 04:40:57  No: 117041

なんとなーく、会話のキャッチボールが成立していないような(orz
ま、多分
Open "SomeText.txt" For Binary As #1
  Put #1, , "文字列"
  Put #1, , Hex$(&H1A)
  Put #1, , CByte(&H1A)
Close
これを解析すれば、分かるんじゃないかと。


あこ  2004-10-19 06:19:34  No: 117042

皆様 ありがとうございました(T_T)
ちゃんと データを 書き込む事は出来るようになりました。。。
でも、ファイルの最初に書き込まれてしまって・・
実は、こちらのコードを最終バイトフラグに使用したいのですが・・
バイナリモードで開いたファイルに対しての追加書込みはできるのでしょうか?
これも、基本的な事かもしれませんが、・・
モードの設定を知っている限り試してみたり・・
バイナリファイルの書込みについて検索してみたのですが、
思うような結果が見つけられなかったので 
知っていましたら、よろしくお願いいたしますm(_ _;)m


魔界の仮面弁士  2004-10-19 07:07:09  No: 117043

まず、
  Put #ファイル番号, , データ
という構文は、「現在のバイト位置」に出力するための物です。

この「現在のバイト位置」は、Open直後はファイルの先頭にありますが、
Put/Getする度に、そのデータの分だけ、ファイルの後方に移動していきます。

そして、この位置を修正するには、『Seek ステートメント』を使います。
逆に、現在の位置を調べる時には、『Seek 関数』を使います。
(これらについては、ヘルプで調べて見てください)

あるいは、Seekを使う替わりに、
  Put #ファイル番号, バイト位置, データ
の構文を利用して、出力位置を直接指定することもできます。


あこ  2004-10-19 08:19:38  No: 117044

みなさま  本当にありがとうございました!!
・・最初から最後まで  聞いてしまいまして・・すみませんでした(_ _;;)
先ほど  解決いたしました。
本当に本当に・・感謝いたします。と供に反省しております。。


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




  


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