by konisi » 2007年7月19日(木) 22:14
次のようにすれば16進数に出来ます。
res.txtから再変換するのは効率が悪いので、元のファイルから直接求めています。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
#console
Const InputFileName="in.txt"
Const OutputFileName="res.txt"
Dim hInFile As HANDLE,hOutFile As HANDLE
Dim buf1 As Byte,buf2[7] As Byte
Dim InFileLength As Int64,i As Int64
Dim dummy As Long
'ファイルを開く
hInFile=CreateFile(InputFileName,GENERIC_READ,FILE_SHARE_READ,ByVal NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0)
If hInFile=INVALID_HANDLE_VALUE then
Print "入力ファイルを開けませんでした。"
Print "ファイル名:",InputFileName
Sleep(-1)
End If
hOutFile=CreateFile(OutputFileName,GENERIC_WRITE,FILE_SHARE_READ,ByVal NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0)
If hOutFile=INVALID_HANDLE_VALUE then
Print "出力ファイルを新規作成できませんでした。"
Print "ファイル名:",OutputFileName
CloseHandle(hInFile)
Sleep(-1)
End If
'入力ファイルのサイズを調べる。
SetDWord(VarPtr(InFileLength),SetFilePointer(hInFile,0,VarPtr(InFileLength)+4,FILE_END))
'前処理
SetFilePointer(hInFile,0,0,FILE_BEGIN)
i=0
'本処理
Do
'読み込み
ReadFile(hInFile,VarPtr(buf1),1,VarPtr(dummy),ByVal 0)
'変換
ToHex(buf2,buf1)
'書き込み
WriteFile(hOutFile,buf2,2,VarPtr(dummy),ByVal 0)
'後処理
i=i+1
If i=InFileLength then Exit Do
Loop
'後処理
CloseHandle(hInFile)
CloseHandle(hOutFile)
Print "終了しました。"
Sleep(-1)
Sub ToHex(d As *Byte,s As Byte)
Dim h="0123456789ABCDEF" As *Byte
d[0]=h[(s>>4) And 15]
d[1]=h[s And 15]
End Sub
10進数の場合は値によって桁数が変わるので、ここではカンマで区切る事にします。
うまく応用してください。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
#console
Const InputFileName="in.txt"
Const OutputFileName="res.txt"
Dim hInFile As HANDLE,hOutFile As HANDLE
Dim buf1 As Byte,buf2[7] As Byte
Dim InFileLength As Int64,i As Int64
Dim dummy As Long,l As Long
'ファイルを開く
hInFile=CreateFile(InputFileName,GENERIC_READ,FILE_SHARE_READ,ByVal NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0)
If hInFile=INVALID_HANDLE_VALUE then
Print "入力ファイルを開けませんでした。"
Print "ファイル名:",InputFileName
Sleep(-1)
End If
hOutFile=CreateFile(OutputFileName,GENERIC_WRITE,FILE_SHARE_READ,ByVal NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0)
If hOutFile=INVALID_HANDLE_VALUE then
Print "出力ファイルを新規作成できませんでした。"
Print "ファイル名:",OutputFileName
CloseHandle(hInFile)
Sleep(-1)
End If
'入力ファイルのサイズを調べる。
SetDWord(VarPtr(InFileLength),SetFilePointer(hInFile,0,VarPtr(InFileLength)+4,FILE_END))
'前処理
SetFilePointer(hInFile,0,0,FILE_BEGIN)
i=0
'本処理
Do
'読み込み
ReadFile(hInFile,VarPtr(buf1),1,VarPtr(dummy),ByVal 0)
'変換
l=ToDec(buf2,buf1)
'書き込み
WriteFile(hOutFile,buf2,l,VarPtr(dummy),ByVal 0)
'後処理
i=i+1
If i=InFileLength then Exit Do
Loop
'後処理
CloseHandle(hInFile)
CloseHandle(hOutFile)
Print "終了しました。"
Sleep(-1)
Function ToDec(d As *Byte,s As Byte) As Long
If s>99 then
d[0]=s\100+48
d[1]=((s\10) Mod 10)+48
d[2]=(s Mod 10)+48
d[3]=Asc(",")
ToDec=4
Else
d[0]=((s\10) Mod 10)+48
d[1]=(s Mod 10)+48
d[2]=Asc(",")
ToDec=3
End If
End Function
なお、この二つのコードはきちんと動くか確かめてません。バグがあったら教えてください。
次のようにすれば16進数に出来ます。
res.txtから再変換するのは効率が悪いので、元のファイルから直接求めています。
[hide][code]#console
Const InputFileName="in.txt"
Const OutputFileName="res.txt"
Dim hInFile As HANDLE,hOutFile As HANDLE
Dim buf1 As Byte,buf2[7] As Byte
Dim InFileLength As Int64,i As Int64
Dim dummy As Long
'ファイルを開く
hInFile=CreateFile(InputFileName,GENERIC_READ,FILE_SHARE_READ,ByVal NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0)
If hInFile=INVALID_HANDLE_VALUE then
Print "入力ファイルを開けませんでした。"
Print "ファイル名:",InputFileName
Sleep(-1)
End If
hOutFile=CreateFile(OutputFileName,GENERIC_WRITE,FILE_SHARE_READ,ByVal NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0)
If hOutFile=INVALID_HANDLE_VALUE then
Print "出力ファイルを新規作成できませんでした。"
Print "ファイル名:",OutputFileName
CloseHandle(hInFile)
Sleep(-1)
End If
'入力ファイルのサイズを調べる。
SetDWord(VarPtr(InFileLength),SetFilePointer(hInFile,0,VarPtr(InFileLength)+4,FILE_END))
'前処理
SetFilePointer(hInFile,0,0,FILE_BEGIN)
i=0
'本処理
Do
'読み込み
ReadFile(hInFile,VarPtr(buf1),1,VarPtr(dummy),ByVal 0)
'変換
ToHex(buf2,buf1)
'書き込み
WriteFile(hOutFile,buf2,2,VarPtr(dummy),ByVal 0)
'後処理
i=i+1
If i=InFileLength then Exit Do
Loop
'後処理
CloseHandle(hInFile)
CloseHandle(hOutFile)
Print "終了しました。"
Sleep(-1)
Sub ToHex(d As *Byte,s As Byte)
Dim h="0123456789ABCDEF" As *Byte
d[0]=h[(s>>4) And 15]
d[1]=h[s And 15]
End Sub[/code][/hide]
10進数の場合は値によって桁数が変わるので、ここではカンマで区切る事にします。
うまく応用してください。
[hide][code]#console
Const InputFileName="in.txt"
Const OutputFileName="res.txt"
Dim hInFile As HANDLE,hOutFile As HANDLE
Dim buf1 As Byte,buf2[7] As Byte
Dim InFileLength As Int64,i As Int64
Dim dummy As Long,l As Long
'ファイルを開く
hInFile=CreateFile(InputFileName,GENERIC_READ,FILE_SHARE_READ,ByVal NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0)
If hInFile=INVALID_HANDLE_VALUE then
Print "入力ファイルを開けませんでした。"
Print "ファイル名:",InputFileName
Sleep(-1)
End If
hOutFile=CreateFile(OutputFileName,GENERIC_WRITE,FILE_SHARE_READ,ByVal NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0)
If hOutFile=INVALID_HANDLE_VALUE then
Print "出力ファイルを新規作成できませんでした。"
Print "ファイル名:",OutputFileName
CloseHandle(hInFile)
Sleep(-1)
End If
'入力ファイルのサイズを調べる。
SetDWord(VarPtr(InFileLength),SetFilePointer(hInFile,0,VarPtr(InFileLength)+4,FILE_END))
'前処理
SetFilePointer(hInFile,0,0,FILE_BEGIN)
i=0
'本処理
Do
'読み込み
ReadFile(hInFile,VarPtr(buf1),1,VarPtr(dummy),ByVal 0)
'変換
l=ToDec(buf2,buf1)
'書き込み
WriteFile(hOutFile,buf2,l,VarPtr(dummy),ByVal 0)
'後処理
i=i+1
If i=InFileLength then Exit Do
Loop
'後処理
CloseHandle(hInFile)
CloseHandle(hOutFile)
Print "終了しました。"
Sleep(-1)
Function ToDec(d As *Byte,s As Byte) As Long
If s>99 then
d[0]=s\100+48
d[1]=((s\10) Mod 10)+48
d[2]=(s Mod 10)+48
d[3]=Asc(",")
ToDec=4
Else
d[0]=((s\10) Mod 10)+48
d[1]=(s Mod 10)+48
d[2]=Asc(",")
ToDec=3
End If
End Function[/code][/hide]
なお、この二つのコードはきちんと動くか確かめてません。バグがあったら教えてください。