[Solucionado] Error al guardar datos binarios

Iniciado por Sancho.Mazorka, 25 Octubre 2010, 08:47 AM

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

Sancho.Mazorka

Hola muchach@s, esto es el evento ws_DataArrival de mi aplicacion, envio un GET para obtener esta imagen (puse el link)

http://us.sapphiretech.com/gm/images/contentLib/icon/ATI%20Stream%20Technology_20091112_3001.gif

La porcion de code que puse aca es la que me trae problemas, veran que es mucho source, pero la mitad es para recibir chunked data, y la otra parte, para recibir los datos enteros (es la que estoy usando para recibir la imagen)

Cuando abro el archivo para escribir el gif que descargue, le agrega 2 caracteres al principio que no se de donde salen, porque hice un Debug.Print(sSplitMensaje(1).Length) y me da el mismo valor que la cabecera Content-Length. Y ese es mi problema, no puedo guardar bien el archivo debido a esos 2 caracteres extra  :-\

Visual Basic .NET 2008

Código (vbnet) [Seleccionar]
Private Sub ws_DataArrival(ByVal sender As Object, ByVal e As AxMSWinsockLib.DMSWinsockControlEvents_DataArrivalEvent) Handles ws.DataArrival

        Dim sBufferMensaje As String = ""
        Dim sChunk() As String

        Dim sJoinChunk As String = ""
        Dim lChunkBytes As Long = 0
        Dim sTemp As Char = ""
        Dim sTempJoin As String = ""
        Dim unir As New System.Text.StringBuilder

        Static bProcHeader As Boolean = False
        Static sMensaje As String = ""
        Static sSplitMensaje(2) As String


        ws.GetData(sBufferMensaje)
        sMensaje += sBufferMensaje

        sSplitMensaje = Split(sMensaje, vbCrLf & vbCrLf, 2, CompareMethod.Text)

        'Procesando una vez la cabecera
        If bProcHeader = False And sSplitMensaje(1) <> "" Then
            bProcHeader = True
            ProcesarHeader(sSplitMensaje(0))
            Exit Sub
        End If

        'Recibiendo partes del mensaje
        If tValHeader.TransEncoding = "chunked" Or tValHeader.TransEncoding = "Chunked" Then
            Do
                sChunk = Split(sSplitMensaje(1), vbCrLf, 2)
                lChunkBytes = Long.Parse(sChunk(0), Globalization.NumberStyles.AllowHexSpecifier)

                If sChunk(1).Length >= lChunkBytes Then
                    sJoinChunk = sJoinChunk & sChunk(1).Substring(0, CInt(lChunkBytes))

                    '***   Tengo que hacer esto, porque no funciona el sSplitMensaje(1).Remove(0, lChunkBytes + 4 + sChunk(0).Length)   ***
                    unir.Append(sSplitMensaje(1).ToString)
                    unir.Remove(0, lChunkBytes + 4 + sChunk(0).Length)
                    sSplitMensaje(1) = unir.ToString
                Else
                    Exit Sub
                End If

            Loop Until lChunkBytes = 0

        ElseIf tValHeader.Length <> 0 Then
            If sSplitMensaje(1).Length <> tValHeader.Length Then Exit Sub
        End If

        Dim binWriter As New BinaryWriter(File.Open("C:\Archivo.gif", FileMode.Create, FileAccess.Write), System.Text.Encoding.Default)

        If tValHeader.Length = 0 Then
            binWriter.Write(sJoinChunk)
        Else
            binWriter.Write(sSplitMensaje(1))
        End If
        binWriter.Flush()
        binWriter.Close()

End Sub


Si alguno quiere el source completo, avise y lo subo para que prueben.

Saludos, Sancho.Mazorka    :¬¬
Ganador Xeon Web Server ! ! !    Sancho.Mazorka :D
http://foro.elhacker.net/index.php/topic,171903.75.html



Sancho.Mazorka

PROBLEMA RESUELTO

Al guardar de manera binaria el contenido del mensaje (el cual era una imagen), agregaba 2 bytes al principio que no se que eran, probe guardando de manera normal y se soluciono

Con este tira error
Código (vbnet) [Seleccionar]
Dim binWriter As New BinaryWriter(File.Open("C:\Archivo.gif", FileMode.Create, FileAccess.Write), System.Text.Encoding.Default)

Con este funciona de maravillas
Código (vbnet) [Seleccionar]
Dim Writer as New StreamWriter("C:\Archivo.gif", False, System.Text.Encoding.Default)


Saludos, Sancho.Mazorka    :¬¬
Ganador Xeon Web Server ! ! !    Sancho.Mazorka :D
http://foro.elhacker.net/index.php/topic,171903.75.html



BlackZeroX

.
como dato esto:

Código (vbnet) [Seleccionar]


sMensaje += sBufferMensaje



No he vuelto ausar .Net pero me parece que quedaria mejor asi no?

Código (vbnet) [Seleccionar]


sMensaje &= sBufferMensaje



solo para evitar sumas de valores no deseados... vb es canijo es estas cosas...

Dulce Infierno Lunar!¡.
.
The Dark Shadow is my passion.

Sancho.Mazorka

Sisi, eso ya lo corregi, para subir una version mas limpia modifique el original pero sin cambiar lo importante. Sumar o concatenar strings VB lo maneja bien, siempre y cuando no mezcles tipos de dato. Y no, ese no era el problema, porque sin modificar el codigo, cambie la linea que muestro arriba y funciono bien :S

Saludos, Sancho.Mazorka    :¬¬
Ganador Xeon Web Server ! ! !    Sancho.Mazorka :D
http://foro.elhacker.net/index.php/topic,171903.75.html