こんにちは。お世話になります。
基本的な事なのかもしれないのですが・・
16進のデータ(具体的には「1A」というものなのですが・・)を
テキストファイルに出力する方法を教えて下さい(_ _)
よろしくお願いいたします。
環境はvb6.0です。
テキストファイルに「1A」(バイナリだと[31],[41])という文字を出力したいのでしょうか
それともバイナリの[1A]という値を出力したいのでしょうか。(これだとテキストファイルに
という言葉は不適切ですが)
前者であればHex関数を用いることで文字列に変換してくれます。
後者の場合はそのままPutで書き込めばいいでしょう。
不適切な説明ですみませんでした。
たぶん、バイナリの「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
そして、プログラムで作る場合は・・・・・
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)
文章を打ってる間に投票があったみたい。
っということで、質問内容と回答が違いました。
あこさんへ
ABCさんが
>後者の場合はそのままPutで書き込めばいいでしょう。
というヒントをくれてるんですから、過去ログ検索『Put』
でバイナリでデータを読んだり書いたりしてる書き込みを
調べるくらいはしましょう。
1から10まで回答者に求めないようにしましょう。
特攻隊長まるるうさま
大変失礼いたしました。。
こちらのページで「put」で検索はしたのですが・・思うような
情報が得られなくて そのまま書いてしまいました。
先程、実験的にバイナリで PUT 書き込みをしてみたりしたのですが・・
追加書込み および データの変換も上手く行かないのです。
データもHEX関数を使用して書込みを試みたのですが
HEXの'1A'データを
使用方法をあやまっているのか・・そのまま「1A」書き込まれております。
本当に申し訳ないのですが・・
16進データのをファイルへ追加書込みできるか教えて下さいm(_ _;;)m
それか、VBリファレンスの参照場所などでも かまいませんので
よろしくお願いいたします。
なんとなーく、会話のキャッチボールが成立していないような(orz
ま、多分
Open "SomeText.txt" For Binary As #1
Put #1, , "文字列"
Put #1, , Hex$(&H1A)
Put #1, , CByte(&H1A)
Close
これを解析すれば、分かるんじゃないかと。
皆様 ありがとうございました(T_T)
ちゃんと データを 書き込む事は出来るようになりました。。。
でも、ファイルの最初に書き込まれてしまって・・
実は、こちらのコードを最終バイトフラグに使用したいのですが・・
バイナリモードで開いたファイルに対しての追加書込みはできるのでしょうか?
これも、基本的な事かもしれませんが、・・
モードの設定を知っている限り試してみたり・・
バイナリファイルの書込みについて検索してみたのですが、
思うような結果が見つけられなかったので
知っていましたら、よろしくお願いいたしますm(_ _;)m
まず、
Put #ファイル番号, , データ
という構文は、「現在のバイト位置」に出力するための物です。
この「現在のバイト位置」は、Open直後はファイルの先頭にありますが、
Put/Getする度に、そのデータの分だけ、ファイルの後方に移動していきます。
そして、この位置を修正するには、『Seek ステートメント』を使います。
逆に、現在の位置を調べる時には、『Seek 関数』を使います。
(これらについては、ヘルプで調べて見てください)
あるいは、Seekを使う替わりに、
Put #ファイル番号, バイト位置, データ
の構文を利用して、出力位置を直接指定することもできます。
みなさま 本当にありがとうございました!!
・・最初から最後まで 聞いてしまいまして・・すみませんでした(_ _;;)
先ほど 解決いたしました。
本当に本当に・・感謝いたします。と供に反省しております。。
ツイート | ![]() |