Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: carlosguay en 20 Abril 2011, 18:41 pm



Título: Ayuda con archivo binario, por favor.
Publicado por: carlosguay en 20 Abril 2011, 18:41 pm
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.

(http://img163.imageshack.us/img163/6223/binario.png)


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
  1. 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.


Título: Re: Ayuda con archivo binario, por favor.
Publicado por: Arkangel_0x7C5 en 20 Abril 2011, 22:16 pm
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 (http://es.wikipedia.org/wiki/Endianness))


Título: Re: Ayuda con archivo binario, por favor.
Publicado por: carlosguay en 21 Abril 2011, 13:42 pm
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.



(http://img31.imageshack.us/img31/3261/binm.png) (http://img31.imageshack.us/i/binm.png/)


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.



Título: Re: Ayuda con archivo binario, por favor.
Publicado por: Arkangel_0x7C5 en 21 Abril 2011, 14:19 pm
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.


Título: Re: Ayuda con archivo binario, por favor.
Publicado por: carlosguay en 21 Abril 2011, 19:09 pm
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
  1.  
  2. Dim a As String
  3. Dim b As String
  4. Dim c As String
  5. Dim d As String
  6. Dim data As String
  7.  
  8. a = Text1
  9. b = Text2
  10. c = Text3
  11. d = Text4
  12. data = a & b & c & d
  13.  
  14. If data <> "" = False Then
  15. End
  16.  
  17. Else
  18. data = d & c & b & a
  19. Text5 = data
  20.  
  21. 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.

(http://img860.imageshack.us/img860/4143/nombrez.png)

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


Título: Re: Ayuda con archivo binario, por favor.
Publicado por: 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


Título: Re: Ayuda con archivo binario, por favor.
Publicado por: carlosguay en 22 Abril 2011, 09:52 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.


Título: Re: Ayuda con archivo binario, por favor.
Publicado por: Arkangel_0x7C5 en 22 Abril 2011, 11:18 am
si quieres invertirlos haz algo así:
Código
  1. long Numero = 0x01020304;//Este es el numero que vamos a invertir
  2. long Invertido = 0;//Lo guardaremos aqui
  3.  
  4. //Cojo la direccion de la variable con & y ago un cast de tipos con (char*)
  5. //para que lo interprete como un array de bytes;
  6. //[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
  7. ((char*)&Invertido)[0] = ((char*)&Numero)[3];
  8. ((char*)&Invertido)[1] = ((char*)&Numero)[2];
  9. ((char*)&Invertido)[2] = ((char*)&Numero)[1];
  10. ((char*)&Invertido)[3] = ((char*)&Numero)[0];
  11.  
  12. printf("Numero %X Invertido %X\n",Numero,Invertido);
  13.  

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)


Título: Re: Ayuda con archivo binario, por favor.
Publicado por: carlosguay en 22 Abril 2011, 12:54 pm


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.


Título: Re: Ayuda con archivo binario, por favor.
Publicado por: carlosguay en 22 Abril 2011, 21:19 pm
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.

Código
  1. if ( addr & 0x2 )  data = (data>>16)&0xffff ;
  2.  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.

Código
  1. fwrite( (unsigned char*) &data, 1, sizeof(data), fd);

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


Título: Re: Ayuda con archivo binario, por favor.
Publicado por: Arkangel_0x7C5 en 23 Abril 2011, 10:25 am
Lo que te pase no debería de comerse ningún numero, si lo dices por la salida por pantalla, es el printf el que no los muestra
Código
  1. printf("Numero %08X Invertido %08X\n",Numero,Invertido);
  2.  
Con esta modificacion muestra tambien los 0 de arriba, pero que no los mostrara no significa que no los invierta. Ese trozo lo puse para que vieras el resultado

Este code esta filtrando en grupos de 2bytes (16bits)
Código
  1. if ( addr & 0x2 )  data = (data>>16)&0xffff ;
  2.  else               data = (data&0x0000ffff) ;
  3.  


Título: Re: Ayuda con archivo binario, por favor.
Publicado por: carlosguay en 24 Abril 2011, 15:45 pm
Pues tengo novedades.

Desde que me dijiste lo de litte-endian, le e estado dando vueltas, ya que yo quiero usar el programa en cualquier pc, la idea de invertir los bytes, creo que no era buena, ya que en un pc big-endian, tambien invertiria los bytes y entonces seguiria estando mal.
He buscado la forma de invertir los datos recogidos, pero solo si el pc, es little, y creo que con esto lo e conseguido.

Código
  1. data = ((i&0xff)<<24)+((i&0xff00)<<8)+((i&0xff0000)>>8)+((i>>24)&0xff);
  2. fwrite( (unsigned char*) &data, 1, sizeof(data), fd);

(http://img577.imageshack.us/img577/1516/foto1qv.png)


Solo me faltaria confirmar, que en un pc big-endian, funcionaria bien.

Pero como los problemas nunca vienen solos, pues lo que te comente del codigo para invertir los bytes, osea que se comia bytes, me referia al archivo y no a la salida de consola, el resultado que con este proceso, tambien me cambia algunos bytes.

(http://img534.imageshack.us/img534/6531/archivosl.png)


Como ves, el archivo sacado com el programa que te comente y el sacado com mi programa, esto creo que va a ser mas dificil de solucionar, xd.

Perdonar por tantas imagenes, pero siempre e creido, que mas vale una imagen que mil palabras.


Título: Re: Ayuda con archivo binario, por favor.
Publicado por: Arkangel_0x7C5 en 25 Abril 2011, 13:53 pm
ese code que pones yo no lo veo dar problemas, lo que dudo es que no los invierta si es Big-endian. Para invertirlos segun sea Big-endian o no yo averiguaría si estas en un PC big-endian o litte-endian
Pon el code completo porque sino me parece que no vamos a encontrar nada

Lo que me muestras, tienen en común el bit de signo, el numero 8 si manejas bytes o el 31 en caso de grupos de 4 bytes, pero como lo inviertes se queda en el numero 8.