¿Como optimizar la apertura de archivos en Binario?

Iniciado por tkows, 3 Enero 2008, 15:09 PM

0 Miembros y 1 Visitante están viendo este tema.

tkows

Hola!

Estoy haciendo un programa y en un momento dado necesito acceder y abrir un archivo en modo binario, el inconveniente es que tarda un gran tiempo y bastantes recursos en abrirlo... La cosa es saber... ¿Como podría optimizarlo? El code que uso es el siguiente:

Código (vb) [Seleccionar]

Dim var As String * 60000
data = ""
var = ""
Open archivo For Binary As #1
Do While Not EOF(1)

Get #1, , var

data = data & var
data = Trim(data)

Loop
Close #1



¿Se puede optimizar? ¿Se puede hacer de otro método más rápido?

Salu2.
Gracias

foobar


Dim btData() As Byte
Dim sData$

Open archivo For Binary As #1

ReDim btData(LOF(1)) As Byte

Get #1,  1, btData

sData = StrConv(btData, vbUnicode)

Close #1

tkows

#2
CitarGracias! Lo pruebo y os cuento...

Salu2.

EDITO: He probado el code pero no he logrado hacerlo funcionar correctamente. Más información acerca de lo que hago, una vez abierto y cargado el archivo en una variable lo que hago es pasarla por una función que digamos "la cifra" y lo uso de la siguiente forma:

Código (vb) [Seleccionar]

Dim btData() As Byte
Dim sData$

Open archivo For Binary As #1

ReDim btData(LOF(1)) As Byte

Get #1,  1, btData


sData = StrConv(btData, vbUnicode)
sData=enc(sData)      ' "enc" es la función...

Close #1


Pero se ve que se queda en un bucle infinito... :S ¿Que es lo que pasa? ¿Será problema de la función?

Salu2.

nhaalclkiemr

ve linea por linea con el F8 en modo depuracion y asi ya ves las lineas en las que se repite...

Saludos ;)
StasFodidoCrypter 1.0 - 100% (old)
StasFodidoCrypter 2.0 - 85% (deserted)
Fire AV/FW-Killer - 97% (deserted)
R-WlanXDecrypter 1.0- 100%

cobein

Para incrementar la velocidad tendrias que usar API (CreateFile, ReadFile , etc.) y no leer el contenido completo del archivo sino que en chunks (multiplos de 8 bytes) es mas rapido a mi entender.
http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.

tkows

Ya he encontrado el problema. No es problema del código de apertura del archivo, es problema de la función de cifrado que le cuesta muchísimo... (Recorrer 60.000 caracteres no debe ser rápido xD). Alguna idea para otro "algoritmo" ?  :-\ :-\
Os dejo el código que utilizo:

cifrar:
Código (vb) [Seleccionar]

Function enc(ByVal S As String, ByVal P As String) As String
Dim I As Long, R As String
Dim C1 As Integer, C2 As Integer
R = ""
If Len(P) > 0 Then
For I = 1 To Len(S)
C1 = Asc(Mid(S, I, 1))
If I > Len(P) Then
C2 = Asc(Mid(P, I Mod Len(P) + 1, 1))
Else
C2 = Asc(Mid(P, I, 1))
End If
C1 = C1 + C2 + 64
If C1 > 255 Then C1 = C1 - 256
R = R + Chr(C1)
Next I
Else
R = S
End If
enc = R

End Function


descifrar:

Código (vb) [Seleccionar]

Function des(ByVal S As String, ByVal P As String) As String
Dim I As Long, R As String
Dim C1 As Integer, C2 As Integer
R = ""
If Len(P) > 0 Then
For I = 1 To Len(S)
C1 = Asc(Mid(S, I, 1))
If I > Len(P) Then
C2 = Asc(Mid(P, I Mod Len(P) + 1, 1))
Else
C2 = Asc(Mid(P, I, 1))
End If
C1 = C1 - C2 - 64
If Sgn(C1) = -1 Then C1 = 256 + C1
R = R + Chr(C1)
Next I
Else
R = S
End If
des = R
End Function


¿Cómo hacer un "codificado" más rápido?

Salu2.

PD: El código de cifrado no es mio, lo encontré en Internet, lo revisé y vi que me servía para lo que quería hacer...

foobar

Usando matriz de byte el código queda absolutamente optimizado. Los Strings son lentos y no son apropiados para operaciones que requieren mucho procesamiento.

El siguiente código lee los datos del archivo a una matriz de Byte, luego cifra los datos modificando el valor de cada byte con un algoritmo sencillo y lineal, y por último convierte a String los datos cifrados.

Para descifrar, hay que convertir los datos a matriz de Byte. Ejemplo:

Código (vb) [Seleccionar]

Dim btData() As Byte
Dim sString$, sDecrypt$

sString = "BRdTYTQ@QRG^"

btData = StrConv(sString, vbFromUnicode)

sDecrypt = Decrypt(btData)

Debug.Print sDecrypt


Código (vb) [Seleccionar]

Sub EncryptFile(Source As String)
  Dim btData() As Byte
  Dim sEnc$

  Open Source For Binary As #1

  ReDim btData(LOF(1)) As Byte

  Get #1,  1, btData

  sEnc = Encrypt(btData)

  Close #1
End Sub

Function Encrypt(pData) As String
  Encrypt = Crypto(pData, True)
End Function

Function Decrypt(pData) As String
  Decrypt = Crypto(pData, False)
End Function

Function Crypto(pData, Optional bEncrypt As Boolean = True) As String
  Dim iFlag%
  Dim i&, lLen&

  lLen = UBound(pData)

  If (bEncrypt) Then iFlag = -1 Else iFlag = 1
 
  For i = 0 To lLen
    pData(i) = pData(i) + ((i + (i Mod lLen) + 17) * iFlag)
  Next

  Crypto = StrConv(pData, vbUnicode)
End Function



Saludos.

tkows

Muchas gracias Seykron. Voy a probarlo y ya te cuento.

Gracias también por la explicación de las strings/matrices de bytes. De ahora en adelante intentaré usar matrices  ;D

Salu2 y gracias!