TODOPIC
FORO TÉCNICO => Foro Técnico => Mensaje iniciado por: groundman en 27 de Enero de 2011, 11:44:59
-
hola.sabria alguien decirme si conoce algun programa que manipule los bytes de una secuencia de ellos.
lo que quiero es un programa que en el cual pueda poner una trama de datos hexagesimales y los dibida en palabras.y posteriormente invertir los bytes.
es algo asi:
12ab34cd56ef -> 0x12ab, 0x34cd, 0x56ef -> 0xab12, 0xcd34, 0xef56
estaba pensando hacerlo en labview.pero llevo tiempo sin programar y me costaria bastante adaptarme.
-
¿Un programa para PC, o para micro?, ¿te vale en C?
-
Hoy tengo tiempo libre. Puedo escribir el programa en C# y darte el EXE. Sólo avísame. ;-)
-
es un programa para PC.en el que quiero copiar de un txt los valores en hexagesimal y pegarlos en el programa.y posteriormente obtener las correcciones.
el motivo es porque quiero capturar tramas ethernet en el wireshark.y pegarlas en una tabla DATA en asm para un pic.
ejemplo de trama:
001eec59ea400010602636020809
conversion:
DATA 0x1e00,0x59ec,0x40ea,0x1000,0x2660,0x0236,0x0908
me bendria perfecto que solo hubiera que copiar y pegar.seria todo mas rapido pero me conformo conque se realize la inversion de los bytes.
-
Que tal hice tu programita espero que te sirva.
tambien subo el codigo fuente por si quieres modificarlo, esta echo en VB 6.0, asi como el ejecutable.
solo pones el codigo en la primer venta le das a convertir y despues en el boton de "copiar al portapapeles" y ya le das pegar donde quieras
'*******************************************************
Private Sub Command1_Click()
Convertir (Text1)
End Sub
Sub Convertir(Cadena As String)
Dim Result As String
Dim Dato As String
Result = "DATA "
For i = 1 To Len(Cadena) Step 4
Dato = Mid(Cadena, i, 4)
Result = Result & "0x" & Swap(Dato) & ","
Next i
Text2 = Left(Result, Len(Result) - 1) 'Le quita la ultima ","
End Sub
Function Swap(Dato As String) As String 'Invierte los bytes
Swap = Mid(Dato, 3, 2) & Mid(Dato, 1, 2)
End Function
Private Sub Command2_Click() 'Copia Text2 en el portapapeles de Windows
Clipboard.Clear
Clipboard.SetText Text2.Text
MsgBox "El texto ha sido copiado en el portapapeles", vbInformation, "Copiado"
End Sub
-
muchas gracias dolphin_96. :-/ como se nota que cada uno es maestro en su oficio.
habria tardado en realizar el programa.ya que el poco tiempo de que dispongo lo vuelco enteramente en programar en asm.
guardare tu programa como oro en paño. :D
y gracias tambien a los demas por poner empeño.
aunque tu programa sirve a la perfeccion.habria alguna forma de que el resultado se mostrara de esta forma:
DATA 0X1000,0X2660,0X0236,0X1E00,0X59EC,0X40EA,0X0008,0X0045,0X2E00,0X1E05,0X0040,0X0680,0X0000
DATA 0XA8C0,0X3601,0XA8C0,0X2B01,0XACC1,0XC618,0X37CF,0X9189,0X0E22,0X8226,0X1850,0X2940,0XD283
DATA 0X0000,0X6F68,0X616C,0X0A0D
en vez de una sola linea? teniendo la posibilidad de elegir cuantas palabras contener en en cada linea.de esta forma el texto queda preparado para pegarlo
directamente en el codigo.
solo te lo sugiero si no te va a dar mucho trabajo.no quedria abusar de tu amabilidad por tu tiempo prestado. :lol:
-
claro que si no hay problema
Se me ocurrio algo mas sencillo y retome el codigo que te habia hecho,
es hacerlo en excel en una macro a ver que te parece.
saludos
-
depende de la trama ethernet que capture.el maximo que tiene una trama ethernet es de 1500bytes
pero todo lo mas que voy a trabajar es de 64bytes aunque hay tramas de 150bytes.depende de la aplicacion que valla a realizar.
lo que si que seria necesario es que en cada linea resultante no hubiera mas de 16 palabras (32bytes) porque si no.los caracteres se pasarian de la zona de trabajo de la pantalla.
-
la verdad es que el primer programa lo entiendo mejor que la hoja excel.me parece mejor opcion. ;-)
-
el codigo es axactamente lo mismo, solo aprime ctrl+F11, para que lo veas, solo le agrgue un ciclo que busca el final de lo que se pone en la columna 1. no es necesario que pongas tu informacion renglon por renglon, copia exactamente todo lo que tengas en el archivo de texto, y pegalo en la celda A3, y automaticamente se acomodara en los renglones, despues le das click al boton de convertir, y lo que se genera en la columna 3 lo copias y lo pegas donde quieras a mi me parece mucho mejor la opcion de excel ya que no hay limite de renglones ni de tamño de caracteres.
recuerda que la informacion debe pegarse a partir de la celda A3 y que el programa parara hasta que encuentre una celda vacia en dicha columna, en caso de que tengas problemas con las macros debes de deshabilitar la seguridad de las macros, en Herramientas/macros/seguridad y ahi las deshabilitas
el codigo es el siguiente y se encuentra en un modulo:
'*****************************************************************
Sub Convertir()
Dim Result As String
Dim Dato As String
Dim Y As Byte
Y = 3
While Cells(Y, 1) <> ""
Result = "DATA "
For i = 1 To Len(Cells(Y, 1)) Step 4
Dato = Mid(Cells(Y, 1), i, 4)
Result = Result & "0x" & Swap(Dato) & ","
Next i
Cells(Y, 2) = Left(Result, Len(Result) - 1) 'Le quita la ultima ","
Y = Y + 1
Wend
End Sub
Function Swap(Dato As String) As String 'Invierte los bytes
Swap = Mid(Dato, 3, 2) & Mid(Dato, 1, 2)
End Function
'*****************************************************************
y un boton que solo tiene el siguiente codigo. y llama la rutina "convertir"
'*******************************************************************
Private Sub CommandButton1_Click()
Convertir
End Sub
'********************************************************************
-
he hecho lo que dices en la hoja de excel.pero al hacer clic en el boton,no sucede nada.y eso que he pegado los datos en la casilla a3
-
Debe ser el office , yo le he probado en office 2003 y 2007 y funciona bien en ambas, pero aqui te envio otra version en VB en la cual puedes meter mas lineas,
saludos
'*****************************************************************************
Private Sub Command1_Click()
Convertir
End Sub
Sub Convertir()
Dim Result As String
Dim Cont As Byte
Dim Linea() As String
Dim Dato As String
Result = ""
Linea = Split(Text1.Text, vbCrLf) 'Separa las lineas de Text1 en strings independientes
For Cont = 0 To UBound(Linea) 'Hasta el final de text1
For i = 1 To Len(Linea(Cont)) Step 4 'Hasta el final de la linea
Dato = Swap(Mid(Linea(Cont), i, 4))
Result = Result & "0x" & Dato & ","
Next i
Cadena = Cadena & "DATA " & Left(Result, Len(Result) - 1) & vbCrLf 'Suma la cadena y quita la ultima ","
Result = ""
Next Cont
Text2 = Cadena
End Sub
Function Swap(Dato As String) As String 'Invierte los bytes
Swap = Mid(Dato, 3, 2) & Mid(Dato, 1, 2)
End Function
Private Sub Command2_Click() 'Copia Text2 en el portapapeles de Windows
Clipboard.Clear
Clipboard.SetText Text2.Text
MsgBox "El texto ha sido copiado en el portapapeles", vbInformation, "Copiado"
End Sub
'*****************************************************************************
-
yo me referia a meter una sola linea a la entrada y mediante un valor numerico seleccionable en una casilla poder tener a la salida las lineas que pudieran
caber segun el numero seleccionado
por ejemplo si el valor en la casilla fuera 8 quedaria asi:
DATA 0xff00,0xffff,0xffff,0x00ff,0xa304,0x0000,0x0800,0x0006
DATA 0x0801,0x0600,0x0004,0x0001,0xa304,0x0000,0xc000
DATA 0x01a8,0x006e,0x0000,0x0000,0xc000,0x01a8,0x002b
DATA 0x00
y si fuera 16 quedaria asi:
DATA 0xff00,0xffff,0xffff,0x00ff,0xa304,0x0000,0x0800,0x0006,0x0801,0x0600,0x0004,0x0001,0xa304,0x0000,0xc000
DATA 0x01a8,0x006e,0x0000,0x0000,0xc000,0x01a8,0x002b, 0x00
de todas formas tu programa va de perlas.y te agradezco tu aportacion.
-
hola de nuevo dolphin_96.tu programa me ha venido de maravilla.
pero analizando el programa que he realizado.veo que es muy complicado gestionar las tramas para aprender de ellas.si para comparar los valores tenemos
que cambiar el orden de los bytes.
por eso queria pedirte si no es mucha molestia.si podrias modificar tu programa para que una serie de bytes quedaran de la siguiente forma sin invertir los bytes.
123456789012345678901234567890123456789012345678901234567890..............
asi
DATA 0x1234,0x5678,0x9012,0x3456,0x7890,0x1234,0x5678,0x9012
DATA 0x3456,0x7890,0x1234,0x5678,0x9012,0x3456,0x7890,0x1234
DATA 0x5678,0x9012,0x3456,0x7890,0x1234,0x5678,0x9012,0x3456
es decir.agrupar la linea de numeros que puede llegar a contener hasta 4000 ciflas.en lineas DATA de 8 palabras de 2byes.o almenos separar la linea de cifras
en grupos de 4 numero separados por 0x . asi 0x1234,0x5678,..........
si no puedes no te preocupes.me tendria que poner de nuevo con el vbasic.tardaria bastante pero supongo que al final lo lograria.
saludos
-
Hola, eso ya lo puedes hacer facil con los codigo que te envie: solo es cosa de cambiar la funcion swap y quedaria asi, solo compilalo y ya queda te envio el codigo, asi le puedes hacer las modificaciones que quieras y se te ocurran en un futuro.
saludos.
'*****************************************************************************
Function Swap(Dato As String) As String 'no Invierte los bytes
Swap = Mid(Dato, 1, 2) & Mid(Dato, 3, 2)
End Function
'*****************************************************************************
-
si.eso ya lo hize.
lo que no se es como hacer lineas DATA de un valor determinado de bytes.