C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: 256バイト倍数サイズへのテキスト加工処理


(過去ログ 86 を表示中)

[トピック内 17 記事 (1 - 17 表示)]  << 0 >>

■50769 / inTopicNo.1)  256バイト倍数サイズへのテキスト加工処理
  
□投稿者/ VB533151 (1回)-(2010/06/17(Thu) 16:08:49)

分類:[VB6 以前] 

【環境 VB6】

お世話になります。

VB6プログラムで、データベースからテキスト出力を行っているのですが
出力後のテキストについて、256バイトの倍数に満たない部分(下記例)について、
16進数でいうところの"0x00"をセットし、256バイトの倍数サイズのテキストにしたいと思っています。
どのようにすれば宜しいでしょうか?

例)
100バイトのテキストの場合、156バイト"0x00"をセットし256バイトへ
300バイトのテキストの場合、212バイト"0x00"をセットし512バイトへ
1000バイトのテキストの場合、24バイト"0x00"をセットし1024バイトへ

引用返信 編集キー/
■50771 / inTopicNo.2)  Re[1]: 256バイト倍数サイズへのテキスト加工処理
□投稿者/ 中博俊 (1417回)-(2010/06/17(Thu) 17:03:26)
> 100バイトのテキストの場合、156バイト"0x00"をセットし256バイトへ
> 300バイトのテキストの場合、212バイト"0x00"をセットし512バイトへ
> 1000バイトのテキストの場合、24バイト"0x00"をセットし1024バイトへ

対象の文字列出力する
256 - (カウントしたバイト数 % 256) を出力する

引用返信 編集キー/
■50772 / inTopicNo.3)  Re[2]: 256バイト倍数サイズへのテキスト加工処理
□投稿者/ 774RR (515回)-(2010/06/17(Thu) 17:23:36)
それでは元データがちょうど 256 の倍数であったときに膨れるのではないかな・・・
引用返信 編集キー/
■50776 / inTopicNo.4)  Re[3]: 256バイト倍数サイズへのテキスト加工処理
□投稿者/ 中博俊 (1418回)-(2010/06/17(Thu) 17:53:22)
ああw
まぁ適宜チェックしていただいて・・・
引用返信 編集キー/
■50779 / inTopicNo.5)  Re[4]: 256バイト倍数サイズへのテキスト加工処理
□投稿者/ VB533151 (2回)-(2010/06/17(Thu) 18:19:28)
どなたかサンプルソースをご提示頂けると有り難いのですが…
引用返信 編集キー/
■50784 / inTopicNo.6)  Re[5]: 256バイト倍数サイズへのテキスト加工処理
□投稿者/ 魔界の仮面弁士 (1670回)-(2010/06/17(Thu) 20:45:23)
No50779 (VB533151 さん) に返信
> どなたかサンプルソースをご提示頂けると有り難いのですが…

Const BlockSize As Integer = 256

Dim stm As ADODB.Stream
Set stm = New ADODB.Stream
stm.Open
stm.Type = adTypeText

'文字コードの指定
'stm.Charset = "Unicode"
stm.Charset = "Shift_JIS"

'テキスト出力
stm.WriteText "Sample Text Data", adWriteChar
stm.WriteText "サンプルテキスト", adWriteChar

'サイズ調整
Dim paddingLength As Integer
paddingLength = BlockSize - (stm.Size Mod BlockSize)
If paddingLength <> BlockSize Then
 stm.WriteText String(paddingLength, 0)
End If
stm.SetEOS

'保存
stm.SaveToFile "C:\sample.dat", adSaveCreateOverWrite
stm.Close
引用返信 編集キー/
■50803 / inTopicNo.7)  Re[6]: 256バイト倍数サイズへのテキスト加工処理
□投稿者/ VB533151 (4回)-(2010/06/18(Fri) 12:32:12)
No50784 (魔界の仮面弁士 さん) に返信
> Const BlockSize As Integer = 256
>
> Dim stm As ADODB.Stream
> Set stm = New ADODB.Stream
> stm.Open
> stm.Type = adTypeText
>
> '文字コードの指定
> 'stm.Charset = "Unicode"
> stm.Charset = "Shift_JIS"
>
> 'テキスト出力
> stm.WriteText "Sample Text Data", adWriteChar
> stm.WriteText "サンプルテキスト", adWriteChar
>
> 'サイズ調整
> Dim paddingLength As Integer
> paddingLength = BlockSize - (stm.Size Mod BlockSize)
> If paddingLength <> BlockSize Then
>  stm.WriteText String(paddingLength, 0)
> End If
> stm.SetEOS
>
> '保存
> stm.SaveToFile "C:\sample.dat", adSaveCreateOverWrite
> stm.Close


ご提示頂きありがとうございます。

上記の場合、256バイト以下に限られるているかと思われます。
例えば、300バイトの文字列には、212バイト追加したいです。
1000バイトの場合は、24バイト追加するという様に、可変データに対して対応出来る様にしたいです。

あと、16進数でいうところの"0x00"をセットするにはどういしたら宜しいでしょうか?


引用返信 編集キー/
■50805 / inTopicNo.8)  Re[7]: 256バイト倍数サイズへのテキスト加工処理
□投稿者/ 魔界の仮面弁士 (1673回)-(2010/06/18(Fri) 13:30:26)
No50803 (VB533151 さん) に返信
> 例えば、300バイトの文字列には、212バイト追加したいです。
> 1000バイトの場合は、24バイト追加するという様に、可変データに対して対応出来る様にしたいです。
提示したコードには、既に、そのための処理が加えられているはずですが、
実際には、212バイト/24バイトの追加が行われなかったということでしょうか?

> あと、16進数でいうところの"0x00"をセットするにはどういしたら宜しいでしょうか?
No50784 の「サイズ調整」の所に書いてありますよ。
引用返信 編集キー/
■50807 / inTopicNo.9)  Re[1]: 256バイト倍数サイズへのテキスト加工処理
□投稿者/ やじゅ (1652回)-(2010/06/18(Fri) 13:46:43)
やじゅ さんの Web サイト
2010/06/18(Fri) 13:55:40 編集(投稿者)

No50769 (VB533151 さん) に返信
> 【環境 VB6】
> 100バイトのテキストの場合、156バイト"0x00"をセットし256バイトへ
> 300バイトのテキストの場合、212バイト"0x00"をセットし512バイトへ
> 1000バイトのテキストの場合、24バイト"0x00"をセットし1024バイトへ

Fix(100 / 256 + 0.9) * 256 - 100 = 156
Fix(300 / 256 + 0.9) * 256 - 300 = 212
Fix(1000 / 256 + 0.9) * 256 - 1000 = 24

↓の方が簡単でしたね。

256 - (カウントしたバイト数 % 256)

Const BlockSize As Integer = 256
BlockSize - (stm.Size Mod BlockSize)
引用返信 編集キー/
■50814 / inTopicNo.10)  Re[8]: 256バイト倍数サイズへのテキスト加工処理
□投稿者/ みきぬ (926回)-(2010/06/18(Fri) 15:33:49)
> 256 - (カウントしたバイト数 % 256)

(256 - (カウントしたバイト数 % 256)) % 256

引用返信 編集キー/
■50821 / inTopicNo.11)  Re[9]: 256バイト倍数サイズへのテキスト加工処理
□投稿者/ 魔界の仮面弁士 (1674回)-(2010/06/18(Fri) 18:32:29)
No50814 (みきぬ さん) に返信
>>256 - (カウントしたバイト数 % 256)
> (256 - (カウントしたバイト数 % 256)) % 256

なお、中博俊さんやみきぬさんが書かれている % とは、
剰余演算子を表しています。VB6 でいうところの Mod 演算子です。

# VB533151さん自身は、16進数を(&H ではなく)0x で表記されていたことから、
# もしかしたら % の意味を理解されているかも知れませんが、一応補足。
引用返信 編集キー/
■50822 / inTopicNo.12)  Re[2]: 256バイト倍数サイズへのテキスト加工処理
□投稿者/ 魔界の仮面弁士 (1675回)-(2010/06/18(Fri) 19:01:26)
No50807 (やじゅ さん) に返信
> Fix(100 / 256 + 0.9) * 256 - 100 = 156
> Fix(300 / 256 + 0.9) * 256 - 300 = 212
> Fix(1000 / 256 + 0.9) * 256 - 1000 = 24

その計算式は間違っているかと。
256×0.1 は 25.6 ですから、たとえば元データが 25バイト以下の場合に NG となります。

Fix(510 / 256 + 0.9) * 256 - 510 = 2
Fix(511 / 256 + 0.9) * 256 - 511 = 1
Fix(512 / 256 + 0.9) * 256 - 512 = 0
Fix(513 / 256 + 0.9) * 256 - 513 = -1 '← 255 になっていない
Fix(514 / 256 + 0.9) * 256 - 514 = -2 '← 254 になっていない


> Const BlockSize As Integer = 256
> BlockSize - (stm.Size Mod BlockSize)
その後にあった If 文を削らないで下さい。256 の倍数バイトの時に NG となってしまいますので。< No50772

もしも If 文を削るのであれば、
 (BlockSize - (stm.Size Mod BlockSize)) Mod BlockSize
などとしてあげてください。< No50814
引用返信 編集キー/
■50878 / inTopicNo.13)  Re[3]: 256バイト倍数サイズへのテキスト加工処理
□投稿者/ VB533151 (6回)-(2010/06/21(Mon) 15:49:58)
皆様色々と御指摘ありがとうございます。

私なりに修正を行ないましが、どうもうまくいきません。

以下は修正を行なう既存ソースになります。
途中、改行コードを削って、「TBL0001.TXT」から「result_TBL0001.TXT」へ編集しているのですが、
同タイミングで256バイト倍数への加工処理(16進数でいうところの"0x00"を最後尾にセット)を実施する場合には
どのようにすれば宜しいでしょうか?


'*************************************************
'* データ加工プログラム起動
'*************************************************
Sub usTestPLSQL(sType As String, iFlg As Integer)
Dim sWrk As String
Dim sPath As String
Dim iFlg2 As Integer
Dim objDb As Object
Dim objSess As Object
Dim sSQL As String
Dim lLen As Long
Dim iFno As Integer
Dim iFnox As Integer
Dim sLine As String

iFlg = 0
On Error GoTo LBL_ERROR

sPath = clsMCommTestRecv.TestDir & "result_TBL" & sType & ".TXT"
usDelFile sPath

sPath = clsMCommTestRecv.TestDir & "TBL" & sType & ".TXT"
usDelFile sPath

Set objSess = CreateObject("SQLserInProcServer.XOraSession")
Set objDb = objSess.DbOpenDatabase(clsMCommTestRecv.OraServiceNm, clsMCommTestRecv.OraIdPass, 0&)

'ファイル存在チェック
usResultChk sPath, iFlg2

If iFlg2 = 0 Then
Set objDb = Nothing
'0バイトファイル削除
usDelFile sPath
clsMCommTestRecv.pubbFlg_Err = False
Exit Sub
End If

'改行コードを削ります。 TBL0001.TXT -> result_TBL0001.TXT(改行なし)
sPath = clsMCommTestRecv.TestDir & "TBL" & sType & ".TXT"
sWrk = clsMCommTestRecv.TestDir & "result_TBL" & sType & ".TXT"

lLen = FileLen(sPath)
If lLen > 0 Then
iFno = FreeFile
'ファイルのオープン
Open sPath For Input As #iFno
iFnox = FreeFile
'ファイルのオープン
Open sWrk For Binary As #iFnox
Do While Not EOF(iFno)
'1行読み込む
Line Input #iFno, sLine
Put #iFnox, , sLine
Loop
'ファイルクローズ
Close #iFno
Close #iFnox
iFlg = 1
Else
Kill (sPath)
End If

Set objDb = Nothing
Exit Sub
LBL_ERROR:
sERR = "usTestPLSQL(" & objDb.LastServerErrText & ")" & sERR
Set objDb = Nothing
usRaise
End Sub

引用返信 編集キー/
■50888 / inTopicNo.14)  Re[4]: 256バイト倍数サイズへのテキスト加工処理
□投稿者/ 魔界の仮面弁士 (1679回)-(2010/06/21(Mon) 18:59:00)
2010/06/21(Mon) 19:19:53 編集(投稿者)

No50878 (VB533151 さん) に返信
> 同タイミングで256バイト倍数への加工処理(16進数でいうところの"0x00"を最後尾にセット)を実施する場合には
> どのようにすれば宜しいでしょうか?
何バイト分の 0x00 を追加すべきか、その算出方法は既に回答がついていますね。

で、その長さを paddingLength という変数に入れていたとすれば、そのサイズ分の
0x00 をバイナリファイルの末尾に追加するために、ファイルクローズ処理の直前に
 If 0 < paddingLength And paddingLength < 256 Then
  ReDim blank(0 To paddingLength - 1) As Byte
  Put #iFnox, , blank
 End If
というコードを入れておけば良いかと。

もし、テキストとして開いている方に追加したいなら、
 If 0 < paddingLength And paddingLength < 256 Then
  Print #iFno, String(paddingLength, 0); '末尾セミコロンを忘れずに
 End If
ですね。

あるいは No50784 で示したように Stream 経由で処理するという手もあります。


> Sub usTestPLSQL(sType As String, iFlg As Integer)
「Sub usTestPLSQL(ByVal sType As String, ByRef iFlg As Integer)」
とした方が、引数の入出力方向が明確になるかと。

>   Dim sSQL As String
この変数は何者でしょうか?

>   Set objSess = CreateObject("SQLserInProcServer.XOraSession")
>   Set objDb = objSess.DbOpenDatabase(clsMCommTestRecv.OraServiceNm, clsMCommTestRecv.OraIdPass, 0&)
この処理は、何のためにおこなっているのでしょうか?

Oracle に接続しているのだという事は分かりますが、ローカル変数 objDb や objSess が
他のプロシージャに渡されている様子はありませんし、DB にアクセスしている処理も無いので、
ここでデータベースに接続するのは、まったく意味が無いように思えるのですが…。


>     'ファイルのオープン
>     Open sPath For Input As #iFno
このテキストファイルの文字コードは、Shift_JIS ですか?
もし、ファイル中に Shift_JIS 範囲外のバイナリデータ等が含まれていた場合、
Line Input # の段階で文字化けが発生する可能性がありますので、ご注意ください。


>     'ファイルのオープン
>     Open sWrk For Binary As #iFnox
このファイルは新規ファイルですか? それとも既存ファイルに対する上書きですか?

もし、これから出力しようとする内容よりもサイズの大きいファイル sWrk が
既に存在していた場合、Put # しなかった部分のデータはそのまま残り続けます。
ファイルサイズの自動縮小は行われませんので注意してください(自動拡張は行われます)。



>   lLen = FileLen(sPath)
>   If lLen > 0 Then
(中略)
>   Else
>     Kill (sPath)
>   End If
「Open sPath For Input As #iFno」のデータを
「Open sWrk For Binary As #iFnox」に転記するのですよね。

sPath が 0 バイトだった場合、その sPath 自身を削除していますが、
sWrk の方は、特に削除処理等は行われていないようですね。
ということは、sWrk は新規ファイルという事でしょうか。


>     Kill (sPath)
VB6 の文法では、『Kill sPath』もしくは『Call Kill(sPath)』が正しい記述です。



>       Line Input #iFno, sLine
>       Put #iFnox, , sLine
この手法だと、出力結果に「改行」が無くなりますが、それは意図的なものですか?
たとえば、元テキストが「a{改行}{改行}{改行}b」だった場合、バイナリファイルは
「ab」すなわち 0x61,0x62 というデータで出力される事になります。

また、その方法でテキストを転記していった場合、元データ中の
0x8790 の文字が 0x81E0 (≒)になったり、
0x8795 の文字が 0x81E3 (√)になるなどといった
「文字の置き換え」が発生する可能性がありますが、それは大丈夫でしょうか。


>   Exit Sub
> LBL_ERROR:
>   sERR = "usTestPLSQL(" & objDb.LastServerErrText & ")" & sERR
現在のエラートラップ処理だと、DB エラーではなく、ファイル入出力エラーになった場合でも
oo4o のエラーメッセージが記録されることになってしまいます。エラー処理を見直した方が良いかと。

(sERR というのは、モジュールレベルの変数でしょうか?)
引用返信 編集キー/
■50913 / inTopicNo.15)  Re[3]: 256バイト倍数サイズへのテキスト加工処理
□投稿者/ やじゅ (1657回)-(2010/06/22(Tue) 00:52:43)
やじゅ さんの Web サイト
No50822 (魔界の仮面弁士 さん) に返信
> その計算式は間違っているかと。
> 256×0.1 は 25.6 ですから、たとえば元データが 25バイト以下の場合に NG となります。
>
> Fix(510 / 256 + 0.9) * 256 - 510 = 2
> Fix(511 / 256 + 0.9) * 256 - 511 = 1
> Fix(512 / 256 + 0.9) * 256 - 512 = 0
> Fix(513 / 256 + 0.9) * 256 - 513 = -1 '← 255 になっていない
> Fix(514 / 256 + 0.9) * 256 - 514 = -2 '← 254 になっていない

おっと、失礼しました(^^;
方法は間違ってなかってけど、切り上げ方法が甘かったです。
0.9ではなく、0.999にしないと駄目ですね。
Fix(513 / 256 + 0.999) * 256 - 513 = 255
引用返信 編集キー/
■50924 / inTopicNo.16)  Re[4]: 256バイト倍数サイズへのテキスト加工処理
□投稿者/ 魔界の仮面弁士 (1681回)-(2010/06/22(Tue) 09:19:57)
2010/06/22(Tue) 09:36:44 編集(投稿者)

No50913 (やじゅ さん) に返信
> 方法は間違ってなかってけど、切り上げ方法が甘かったです。
ちなみに、正数の切り上げだけが目的なら、
 Fix(size / 256 + 0.999)
の代わりに、
 -Int(size / -256)
と記述することもできます。


> 0.9ではなく、0.999にしないと駄目ですね。
0.9961 ぐらいでも足りますね。255÷256≒0.99609375 なので。

で。Fix を使って切り上げるのであれば、
 Fix((fileSize + blockSize - 1) / blockSize)
の方が良いかも知れません。先の
> Fix(513 / 256 + 0.999) * 256 - 513 = 255
であれば、
 Fix((513 + 255) / 256) * 256 - 513 = 255
という式となります。
先に足すとオーバーフローの可能性が高まりますが、
今回は問題にならないでしょう。

なお、今回のケースでは Double 演算のままでも大丈夫ですが、
数値によっては二進小数誤差が発生する可能性があるため、
結果を十進小数で得たい場合などは、Currentcy での演算に
切り替えた方が良いかと思います。

# とはいえ、個人的には Mod による整数演算を推奨。
引用返信 編集キー/
■51226 / inTopicNo.17)  Re[5]: 256バイト倍数サイズへのテキスト加工処理
□投稿者/ VB533151 (7回)-(2010/06/28(Mon) 13:45:59)
2010/06/28(Mon) 13:57:19 編集(投稿者)
2010/06/28(Mon) 13:57:10 編集(投稿者)

度々申し訳ありません。

御指摘いただいた内容で修正を試みましたが
以下の問題が発生しています。

1、sWrk2にsWrkをセットすると、加工処理が何も行われない。
sWrk2にsPathをセットすると、加工処理が行われるが、改行コードが含まれる為、256バイト倍数にならない

sPath = clsMCommTestRecv.TestDir & "TBL" & sType & ".TXT"
sWrk = clsMCommTestRecv.TestDir & "result_TBL" & sType & ".TXT"

lLen = FileLen(sPath)
If lLen > 0 Then
iFno = FreeFile
'ファイルのオープン
Open sPath For Input As #iFno
iFnox = FreeFile
'ファイルのオープン
Open sWrk For Binary As #iFnox
Do While Not EOF(iFno)
'1行読み込む
Line Input #iFno, sLine
Put #iFnox, , sLine
Loop
'256バイト倍数への加工処理
sWrk2 = FileLen(sPath)
paddingLength = BlockSize - (sWrk2 Mod BlockSize)
If 0 < paddingLength And paddingLength < 256 Then
ReDim blank(0 To paddingLength - 1) As Byte
Put #iFnox, , blank
End If
'ファイルクローズ
Close #iFno
Close #iFnox
iFlg = 1
Else
Kill (sPath)
End If

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -