Autore Topic: Semplice Editor Esadecimale  (Letto 666 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Semplice Editor Esadecimale
« il: 19 Febbraio 2017, 05:22:26 »
Di seguito il codice di un semplice Editor Esadecimale per vedere ed eventualmente modificare i byte di un qualsiasi file.

Codice: [Seleziona]
Private TextArea1 As TextArea


Public Sub Form_Open()

  Dim Menu1 As Menu
  Dim mn1 As Menu
  Dim mn2 As Menu
  Dim mn3 As Menu

   With Me
     .W = 480
     .H = 500
     .Caption = "Editor esadecimale"
   End With
   
   With TextArea1 = New TextArea(Me)
     .X = 15
     .Y = 15
     .W = 440
     .H = 400
     .Font.Size = 12
     .Wrap = True
   End With
   
   With Menu1 = New Menu(Me)
     .Caption = "File"
   End With
   
   With mn1 = New Menu(Menu1, False) As "mn1"
     .Caption = "Apri file"
     .Name = "Apri"
   End With
   
   With mn2 = New Menu(Menu1, False) As "mn2"
     .Caption = "Salva con nome..."
     .Name = "Salva con nome..."
   End With
   
   With mn3 = New Menu(Menu1, False) As "mn3"
     .Caption = "Esci"
     .Name = "Esci"
   End With

End


Public Sub mn1_Click()

  Dim s, t As String
  Dim bb As Byte[]
  Dim i As Integer
 
    With Dialog
      .Title = "Apri file"
      If .OpenFile() Then Return
      s = .Path
    End With
   
    bb = Byte[].FromString(File.Load(s))
   
    For i = 0 To bb.Max
      If (i > 10) And (i Mod 16 = 0) Then
        t &= Hex(bb[i], 2) & Chr(32)
      Else
        t &= Hex(bb[i], 2) & Chr(32)
      Endif
    Next
   
    With TextArea1
      .Text = t
      .Pos = 1
    End With

End


Public Sub mn2_Click()

  Dim s As String
  Dim ss, tt As String[]
  Dim i As Integer
   
    If TextArea1.Text = Null Then Return

    ss = Split(TextArea1.Text, Chr(32))
    ss.Delete(ss.Max, 1)

    tt = New String[ss.Count]

    For i = 0 To ss.Max

      tt.Push(MkByte(Val("&" & ss[i])))
    Next
   
    With Dialog
      .Title = "Salva file con nome..."
      If .SaveFile() Then Return
      File.Save(.Path, tt.Join(Null, Null))
    End With

End


Public Sub mn3_Click()
 
  Me.Close
 
End
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 959
    • Mostra profilo
Re:Semplice Editor Esadecimale
« Risposta #1 il: 19 Febbraio 2017, 17:29:38 »
Non ho capito la ripetizione di queste due linee assolutamente identiche tra loro:

Codice: [Seleziona]
f (i > 10) And (i Mod 16 = 0) Then
        t &= Hex(bb[i], 2) & Chr(32)
      Else
        t &= Hex(bb[i], 2) & Chr(32)
Endif
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Semplice Editor Esadecimale
« Risposta #2 il: 19 Febbraio 2017, 18:10:08 »
Non ho capito la ripetizione di queste due linee assolutamente identiche tra loro:

Codice: [Seleziona]
f (i > 10) And (i Mod 16 = 0) Then
        t &= Hex(bb[i], 2) & Chr(32)
      Else
        t &= Hex(bb[i], 2) & Chr(32)
Endif

E' perché se uno non l'ha capito bene, allora ci sbatte la testa una seconda volta.  :rotfl:

Sì, hai ragione: è una sorta di refuso.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Semplice Editor Esadecimale
« Risposta #3 il: 19 Febbraio 2017, 18:18:10 »
...ad ogni modo propongo quest'altro codice per un programma più elegante:

Codice: [Seleziona]
Private TableView1 As TableView


Public Sub Form_Open()

  Dim Menu1 As Menu
  Dim mn1 As Menu
  Dim mn2 As Menu
  Dim mn3 As Menu
  Dim b As Byte

   With Me
     .W = 480
     .H = 500
     .Caption = "Editor Esadecimale"
   End With
 
   With TableView1 = New TableView(Me) As "TableView1"
     .X = 15
     .Y = 15
     .W = 446
     .H = 400
     .Font.Size = 12
     .Rows.Count = 1
     .Columns.Count = 16
   End With
   
   For b = 0 To TableView1.columns.Max
      TableView1.Columns[b].W = TableView1.W / 16
    Next 
   TableView1[0, 0].Text = "00"
 
   With Menu1 = New Menu(Me)
     .Caption = "File"
   End With
 
   With mn1 = New Menu(Menu1, False) As "mn1"
     .Caption = "Apri file"
     .Name = "Apri"
   End With
 
   With mn2 = New Menu(Menu1, False) As "mn2"
     .Caption = "Salva con nome..."
     .Name = "Salva con nome..."
   End With
 
   With mn3 = New Menu(Menu1, False) As "mn3"
     .Caption = "Esci"
     .Name = "Esci"
   End With

End


Public Sub mn1_Click()

  Dim s As String
  Dim bb As Byte[]
  Dim i, r As Integer
  Dim b As Byte
 
    With Dialog
      .Title = "Apri file"
      If .OpenFile() Then Return
      s = .Path
    End With
   
    bb = Byte[].FromString(File.Load(s))
    If (bb.Count Mod 16) > 0 Then TableView1.Rows.Count = (bb.Count \ 16) + 1
   For b = 0 To TableView1.columns.Max
     TableView1.Columns[b].W = TableView1.W / 16
   Next
 
    For r = 0 To TableView1.Rows.Max
      For b = 0 To 15
        TableView1[r, b].Text = Hex(bb[i], 2)
        Inc i
        If i > bb.Max Then Break
      Next
    Next

End


Public Sub mn2_Click()

  Dim ss As New String[]
  Dim r As Integer
  Dim b As Byte
   
    For r = 0 To TableView1.Rows.Max
      For b = 0 To 15
        If TableView1[r, b].Text = Null Then Break
        ss.Push(MkByte(Val("&" & TableView1[r, b].Text)))
      Next
    Next
   
    With Dialog
      .Title = "Salva file con nome..."
      If .SaveFile() Then Return
      File.Save(.Path, ss.Join(Null, Null))
    End With

End


Public Sub mn3_Click()
 
  Me.Close
 
End


Public Sub TableView1_Click()
 
   TableView1.Edit
 
End


Public Sub TableView1_Save(Row As Integer, Column As Integer, Value As String)
 
   TableView1[Row, Column].Text = Value
 
End
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »