• Status: Solved
• Priority: Medium
• Security: Public
• Views: 187

Binary File

Experts,
Currently i am writing a program that opens a file as binary and it needs to input each byte and adjust it to 3 characters long (e.g.  if the byte is < 10 then add 2 zeros to the front of the number).  Currently i use the get statement to do this...the problem i have run into is that it takes so increadibly long to load the file.  Is there a quicker (much quicker preferably) way to do this?  Let me know...thanks!  Oh ya...sorry for the small ammount of points...i don't have many because i'm new.
0
compguru
• 9
• 7
• 2
• +1
1 Solution

Commented:
Post the snippet of code that you're currently using...

Cheers!
0

Commented:
Hi,

Can you also Mail me a copy of your code please and a sample of you file if possible.

Thanks,

T.
0

Author Commented:
Dim string1(10000) As String

Open "c:\windows\desktop\test.exe" For Binary As #1
ProgressBar1.Max = FileLen("c:\windows\desktop\test.exe") + 1

'Input
For len1 = 1 To 200000000 Step 3000
For z = 0 To 2999
Get #1, len1 + z, tst
If CInt(tst) < 10 Then string1((len1 - 1) / 3000) = string1((len1 - 1) / 3000) & "00" Else If CInt(tst) < 100 Then string1((len1 - 1) / 3000) = string1((len1 - 1) / 3000) & "0"
string1((len1 - 1) / 3000) = string1((len1 - 1) / 3000) & CInt(tst)
If EOF(1) Then Exit For
Next z
ProgressBar1.Value = len1 + z
If EOF(1) Then Exit For
Next len1
Close #1
0

Author Commented:
forgot this....

Dim tst As Byte
0

Commented:
instead of doing this 6 times in the above code:

string1((len1 - 1) / 3000)

Do this right after the GET:

iVal = string1((len1 - 1) / 3000)

Then replace all of the "string1((len1 - 1) / 3000)" with:

string1(iVal)

That should speed your program quite a bit...

Cheers!
0

For a start I would simplify the if statement a bit,

string1(len1 - 1) / 3000) = right("000" & trim(cstr(tst)),3)

should accomplish the task of prefixing with one or two zeros.
0

Author Commented:
This seems to be causing an error....suggestions....?
------
For len1 = 1 To 200000000 Step 3000
For z = 0 To 2999
Get #1, len1 + z, tst
ival = string1((len1 - 1) / 3000)
If CInt(tst) < 10 Then string1(ival) = string1(ival) & "00" Else If CInt(tst) < 100 Then string1(ival) = string1(ival) & "0"
string1(ival) = string1(ival) & CInt(tst)
If EOF(1) Then Exit For
Next z
ProgressBar1.Value = len1 + z
If EOF(1) Then Exit For
Next len1
Close #1
0

Commented:
TimCottee, Yes, that too!

;-)
0

Commented:
Actually, that line:

iVal = string1((len1 - 1) / 3000)

Should have been:

iVal = (len1 - 1) / 3000)

(cut-n-paste booboo!)

Cheers!
0

Commented:
Dang! did it again... should be:

iVal = (len1 - 1) / 3000

Cheers!
0

Author Commented:
how would i implement TimCottee's response?
0

Author Commented:
mcrider...i got yours done...your definately getting some points for that! :)
0

Author Commented:
I have one more question....i tried loading a larger file (1mb about).  Is there any possible way to load that quicker?  I don't care if it involves completely changing my code around (as long as it does the same thing)..but i really would like to be able to speed that loading time up.
0

Commented:
Tims solution would be implemented like this:

Dim string1(10000) As String

Open "c:\windows\desktop\test.exe" For Binary As #1
ProgressBar1.Max = FileLen("c:\windows\desktop\test.exe") + 1

'Input
For len1 = 1 To 200000000 Step 3000
For z = 0 To 2999
Get #1, len1 + z, tst
string1((len1 - 1) / 3000) = Right\$("000" & Trim(CStr(tst)), 3)
If EOF(1) Then Exit For
Next z
ProgressBar1.Value = len1 + z
If EOF(1) Then Exit For
Next len1
Close #1

Cheers!
0

Commented:
By the way, Tim's solution was missing a parenthesis...

Cheers!
0

Author Commented:
so do you have any more suggestions to speed up this process?
0

Commented:
To do anything any faster, you'd have to leave the VB environment and do something in C...

Cheers!
0

Commented:
Thanks for the points! Glad I could help!

Cheers!
0

Sorry about the missing parenthesis, I just typed it out and didn't check it.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.