Ayuda con archivo binario, por favor.

Iniciado por carlosguay, 20 Abril 2011, 18:41 PM

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

carlosguay

Pues tengo un problema algo raro, y esque tengo la cabeza echa polvo de las vueltas que le e dado, xd, a ver si alguien fuera tan amable de resolverme este problema, que seguro sera una tonteria, pero ya me rindo de las vueltas que le e dado.

Mejor una imagen.




Lo de arriba es la salida de pantalla de consola, y lo de abajo es el archivo ya creado, como podeis ver, me invierte los bytes, xd, esta es la forma que escribo en el archivo.

Código (csharp) [Seleccionar]
fwrite( (unsigned char*) &data, 1, sizeof(data), fd);

Los datos que salen por consola, son exactamente los que necesito ir metiendo en el archivo, osea que sacarlos los saca bien, es a la hora de escribirlo en el archivo bin, donde no hay manera.

Pues a ver si me podeis echar una manita, por favor.

gracias y saludos.

Arkangel_0x7C5

en el archivo se esta escribiendo bien, lo que ocurre es que lo imprimes por pantalla en grupos de 4 bytes. Y la CPU lee de derecha a izquierda, siendo los primeros los de mas bajo valor (little-endian)

carlosguay

Te agradezco la respuesta y la informacion, que por cierto no la sabia, xd, pero creo que ahora estoy mas liado que antes, jejejje.

Te explico mas detalladamente, y a ver si me entero de una vez, veras yo creo que es el archivo lo que esta mal, ya que yo tengo un programa que mete los bytes dentro del chip-micro, al que yo se los saco, por medio del puerto paralelo.

Ese programa que te comento, hace bien su trabajo, ya que no lo e hecho yo, jejeje, lo que yo estoy haciendo es leer lo que antes le e escrito, como te digo com otro programa, y el archivo que le escribo es exactamente igual que la salida de pantalla=consola que te puse antes, mira.






Como ves, el archivo bin creado, tiene que ser como el de arriba, yo siguiendo lo que tu comentas, me inclinaria mas, porque la salida de consola, fuera la que estubiera mal, y hay es donde los bytes deberian de ir invertidos.


Arkangel_0x7C5

lo que tu le metes al chip lo guardas en un archivo antes de escribirlo?
Puede ser que ese chip tenga otro orden de bytes diferente. y el otro programa haga una traducción al pasarlo por la consola.

carlosguay

#4
Que va, eso no creo que lo haga el programa, y si hace lo que tu dices, al leer el chip, porque ese programa tambien lee, creaira el archivo igual que mi programa, entiendes?

Habria alguna forma de invertir los bytes a la hora de escribirlos en el archivo?, osea  si leo 00112233, escribirlo igual en el archivo, hacer una espera o algo, para que no escriba 33221100, me explico, o que escriba de 4 en 4 bytes.

El archivo, tiene que quedar como el que te e puesto arriba y como sale por consola, que por cierto, alomejor se podria hacer algo para que me irviertiera los bytes antes de escribirlos en el archivo, no?, alomejor es mas facil eso.

Edito para poner esto.

Me acobo de hacer esta funcion en visual basic, que es de lo que yo se, pero como veras muy poquito claro, mira.
Código (vb) [Seleccionar]


Dim a As String
Dim b As String
Dim c As String
Dim d As String
Dim data As String

a = Text1
b = Text2
c = Text3
d = Text4
data = a & b & c & d

If data <> "" = False Then
End

Else
data = d & c & b & a
Text5 = data

End If


Y hace lo que tenemos que conseguir, bueno es lo que necesito que me expliques, claro, porque yo de C, nada de nada, xd.



Yo creo que si eso, lo hiciera con el data=4bytes, antes de subirlo al archivo, pues tendria lo que necesito.

Karman

lee y escribe de a bytes y no de a 4 bytes, con eso te aseguras copiar el contenido exactamente igual.

S2

carlosguay

Cita de: Karman en 22 Abril 2011, 09:20 AM
lee y escribe de a bytes y no de a 4 bytes, con eso te aseguras copiar el contenido exactamente igual.

S2


Si eso seria una solucion, que seguro funcionaria, pero uno de los chip=micros, que tengo que leer, tiene 8 megas y leyendo de 4 en 4, tarda sobre 50 minutos, osea que al leer de byte en byte, pues seria un aburrimiento, xd.

Llevo dos semanas, con esta tonteria parado, a ver si alguien pudiera explicarme como hacer lo que yo e puesto  en visual, pero para C, ya que creo que con eso solucionaria el problema.

Arkangel_0x7C5

#7
si quieres invertirlos haz algo así:
Código (cpp) [Seleccionar]

long Numero = 0x01020304;//Este es el numero que vamos a invertir
long Invertido = 0;//Lo guardaremos aqui

//Cojo la direccion de la variable con & y ago un cast de tipos con (char*)
//para que lo interprete como un array de bytes;
//[X] es el indice del array que siempre empieza en zero; Un long tiene 4 bytes por lo que el mayor indice seria 3 y el menor 0
((char*)&Invertido)[0] = ((char*)&Numero)[3];
((char*)&Invertido)[1] = ((char*)&Numero)[2];
((char*)&Invertido)[2] = ((char*)&Numero)[1];
((char*)&Invertido)[3] = ((char*)&Numero)[0];

printf("Numero %X Invertido %X\n",Numero,Invertido);


Lo de leerlos de 4 en 4 o de 1 en 1 solo debería de tener importancia al mostrarlos por pantalla, en el archivo se van a guardar igual porque no modificas lo que recibes, solo afecta a la forma de interpretar el numero.(Lectura)

carlosguay

Cita de: Arcangel_0x7C5 en 22 Abril 2011, 11:18 AM


Lo de leerlos de 4 en 4 o de 1 en 1 solo debería de tener importancia al mostrarlos por pantalla, en el archivo se van a guardar igual porque no modificas lo que recibes, solo afecta a la forma de interpretar el numero.(Lectura)



Si esto fuera como dices, seria la mejor solucion, a ver si soy capaz de modificar el codigo que tengo en C, para que lea de 1 en 1, y si no entonces añadirle este que me pones, ya contare resultados, gracias amigo.

carlosguay

Pues no soy capaz de conseguirlo, esto me esta volviendo loco, :P , si cambio la opcion de leer en vez de 4 a 1, que por cierto creo que sera esto.

if ( addr & 0x2 )  data = (data>>16)&0xffff ;
  else               data = (data&0x0000ffff) ;


Como el programa, necesita activar el chip, para escritura o lectura, y supongo que por eso lee de 4 en 4, pues se queda parado hay, y ya no sigue, xd.

Poniendo la funcion que me as pasado, funciona casi bien, creo que al invertirlos tan rapido, se come bastantes bytes, sobre todo ceros.

Si hubiera una forma de escribir en el archivo, de 4 en 4, modificando esto.

fwrite( (unsigned char*) &data, 1, sizeof(data), fd);

Si no, yo ya no se que mas hacer, esto me a ganado ,xd.