From a6d1e09ddb153adc1bed5a782f8d4b6f67ce99b3 Mon Sep 17 00:00:00 2001 From: Thomas Schaller Date: Sun, 29 Dec 2024 13:43:45 +0100 Subject: [PATCH] =?UTF-8?q?Subtrees=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Quellcodes/duc_bit_bmphexeditor/.gitignore | 5 + .../duc_bit_bmphexeditor/BMPHexEditor.jar | Bin 0 -> 30008 bytes .../duc_bit_bmphexeditor/BMPHexEditor.java | 354 ++++++++++++ .../duc_bit_bmphexeditor/BMPHexEditor.jfm | 43 ++ Quellcodes/duc_bit_bmphexeditor/Bild.java | 160 ++++++ Quellcodes/duc_bit_bmphexeditor/Datei.java | 291 ++++++++++ Quellcodes/duc_bit_bmphexeditor/Edit.java | 520 ++++++++++++++++++ Quellcodes/duc_bit_bmphexeditor/readme.adoc | 12 + Quellcodes/duc_bit_hexeditor/.gitignore | 5 + Quellcodes/duc_bit_hexeditor/Datei.java | 274 +++++++++ Quellcodes/duc_bit_hexeditor/Edit.java | 332 +++++++++++ Quellcodes/duc_bit_hexeditor/HexEditor.jar | Bin 0 -> 20800 bytes Quellcodes/duc_bit_hexeditor/HexEditor.java | 287 ++++++++++ Quellcodes/duc_bit_hexeditor/HexEditor.jfm | 43 ++ Quellcodes/duc_bit_hexeditor/readme.adoc | 12 + 15 files changed, 2338 insertions(+) create mode 100644 Quellcodes/duc_bit_bmphexeditor/.gitignore create mode 100644 Quellcodes/duc_bit_bmphexeditor/BMPHexEditor.jar create mode 100644 Quellcodes/duc_bit_bmphexeditor/BMPHexEditor.java create mode 100644 Quellcodes/duc_bit_bmphexeditor/BMPHexEditor.jfm create mode 100644 Quellcodes/duc_bit_bmphexeditor/Bild.java create mode 100644 Quellcodes/duc_bit_bmphexeditor/Datei.java create mode 100644 Quellcodes/duc_bit_bmphexeditor/Edit.java create mode 100644 Quellcodes/duc_bit_bmphexeditor/readme.adoc create mode 100644 Quellcodes/duc_bit_hexeditor/.gitignore create mode 100644 Quellcodes/duc_bit_hexeditor/Datei.java create mode 100644 Quellcodes/duc_bit_hexeditor/Edit.java create mode 100644 Quellcodes/duc_bit_hexeditor/HexEditor.jar create mode 100644 Quellcodes/duc_bit_hexeditor/HexEditor.java create mode 100644 Quellcodes/duc_bit_hexeditor/HexEditor.jfm create mode 100644 Quellcodes/duc_bit_hexeditor/readme.adoc diff --git a/Quellcodes/duc_bit_bmphexeditor/.gitignore b/Quellcodes/duc_bit_bmphexeditor/.gitignore new file mode 100644 index 0000000..c1f4551 --- /dev/null +++ b/Quellcodes/duc_bit_bmphexeditor/.gitignore @@ -0,0 +1,5 @@ +*.class +*.ctxt +*.sh +repo.adoc +*.~lock diff --git a/Quellcodes/duc_bit_bmphexeditor/BMPHexEditor.jar b/Quellcodes/duc_bit_bmphexeditor/BMPHexEditor.jar new file mode 100644 index 0000000000000000000000000000000000000000..5aaabee71a5951ebf76f834fed5f1189c68005c0 GIT binary patch literal 30008 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 + JOptionPane.showMessageDialog(this,"Gesuchte Bytes wurden "+erg+" mal gefunden."); + + } + } + + public void vergleiche() { + int ergebnis = dateiauswahldialog.showOpenDialog(this); + + if(ergebnis != JFileChooser.APPROVE_OPTION) { // abgebrochen + return; + } + + int erg = eingabe.compare(dateiauswahldialog.getSelectedFile()); + repaint(); + if (erg==-1) + JOptionPane.showMessageDialog(this,"Fehler beim Vergleich. Es muss eine Datei geöffnet sein."); + if (erg==0) + JOptionPane.showMessageDialog(this,"Keine Unterschiede gefunden."); + if (erg>0) + JOptionPane.showMessageDialog(this,""+erg+" Bytes unterscheiden sich."); + } + + // Ende Methoden + + public static void main(String[] args) { + new BMPHexEditor("BMPHexEditor"); + } +} diff --git a/Quellcodes/duc_bit_bmphexeditor/BMPHexEditor.jfm b/Quellcodes/duc_bit_bmphexeditor/BMPHexEditor.jfm new file mode 100644 index 0000000..d4987f7 --- /dev/null +++ b/Quellcodes/duc_bit_bmphexeditor/BMPHexEditor.jfm @@ -0,0 +1,43 @@ +object HexEditor: TFGUIFormular + Left = 4 + Top = 6 + BorderIcons = [biSystemMenu, biMinimize] + Caption = 'd:\tom\Informatik\Java\HexEditor\HexEditor.jfm' + ClientHeight = 205 + ClientWidth = 392 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [] + FormStyle = fsMDIChild + OldCreateOrder = True + Position = poDesigned + Visible = True + WindowState = wsMaximized + OnClose = FormClose + OnCloseQuery = FormCloseQuery + OnResize = FormResize + PixelsPerInch = 96 + TextHeight = 16 + object button1: TButton + Tag = 3 + Left = 224 + Top = 128 + Width = 75 + Height = 25 + Caption = 'button1' + TabOrder = 0 + end + object textArea1: TMemo + Tag = 2 + Left = 0 + Top = 24 + Width = 569 + Height = 81 + Lines.Strings = ( + 'textArea1') + TabOrder = 1 + end +end diff --git a/Quellcodes/duc_bit_bmphexeditor/Bild.java b/Quellcodes/duc_bit_bmphexeditor/Bild.java new file mode 100644 index 0000000..cea300c --- /dev/null +++ b/Quellcodes/duc_bit_bmphexeditor/Bild.java @@ -0,0 +1,160 @@ +import java.awt.*; +import java.awt.image.*; +import java.awt.event.*; +import javax.swing.*; +import javax.imageio.*; +import java.io.*; + + +class Bild extends JComponent { + Datei file; + BMPHexEditor parent; + Image image; + int zoom=100; + int posx =2; + int posy =2; + + + /* + class myKeyListener implements KeyListener + { + public void keyPressed( KeyEvent k ) + { + int iHeight = getSize().height; + + if (k.getKeyCode()==8) delete(-1); + if (k.getKeyCode()==127) delete(0); + if (k.getKeyCode()==37) movePos(-1); + if (k.getKeyCode()==39) movePos(1); + if (k.getKeyCode()==38) movePos(-proZeile); + if (k.getKeyCode()==40) movePos(proZeile); + if (k.getKeyCode()==33) movePos(-proZeile*(iHeight/hoehe)); + if (k.getKeyCode()==34) movePos(proZeile*(iHeight/hoehe)); + + } + public void keyReleased(KeyEvent k){} + + public void keyTyped(KeyEvent k){ + // System.out.println( "Typed:"+k.getKeyCode()+"|"+k.getKeyChar() ); + switch(modus) { + case 1: { + if (k.getKeyChar()>='0' && k.getKeyChar()<='1') modifyByte(k.getKeyChar()); + break; + } + case 2: { + if (k.getKeyChar()>='0' && k.getKeyChar()<='9') modifyByte(k.getKeyChar()); + if (k.getKeyChar()>='a' && k.getKeyChar()<='f') modifyByte(k.getKeyChar()); + if (k.getKeyChar()>='A' && k.getKeyChar()<='F') modifyByte(k.getKeyChar()); + break; + } + default: { + if (k.getKeyCode()!= 127) modifyByte(k.getKeyChar()); + } + } + } + } */ + + class myMouseListener implements MouseListener + { + public void mouseClicked( MouseEvent e ) + { + + } + public void mouseExited(MouseEvent e) { + } + public void mouseEntered(MouseEvent e) { + } + public void mousePressed(MouseEvent e) { + setPos((e.getX()-10)*100/zoom+1,(e.getY()-10)*100/zoom+1 ); + parent.posClicked(posx, posy); + } + public void mouseReleased(MouseEvent e) { + } + + + } + + + public Bild(BMPHexEditor p){ + super(); + parent = p; + file = null; + image = null; +// addKeyListener(new myKeyListener()); + addMouseListener(new myMouseListener()); + } + + public void paint(Graphics g){ + int iWidth = getSize().width; + int iHeight = getSize().height; + + + if (file != null && image != null) { + g.drawImage(image,10,10, this); + g.drawRect(9,9,image.getWidth(this)+2,image.getHeight(this)+2); + if (posx >=0 && posy >= 0) { + g.setColor(Color.red); + g.fillRect((posx+1)*zoom/100+10,(posy-1)*zoom/100+10,4*zoom/100,zoom/100); + g.fillRect((posx-1)*zoom/100+10,(posy+1)*zoom/100+10,zoom/100,4*zoom/100); + g.fillRect((posx-6)*zoom/100+10,(posy-1)*zoom/100+10,4*zoom/100,zoom/100); + g.fillRect((posx-1)*zoom/100+10,(posy-6)*zoom/100+10,zoom/100,4*zoom/100); + } + } + } + + public void setDatei(Datei file) { + this.file = file; + try { + image = ImageIO.read(new ByteArrayInputStream(file.getByteArray())); + image = image.getScaledInstance(image.getWidth(this)*zoom/100,image.getHeight(this)*zoom/100,Image.SCALE_DEFAULT); + } catch (Exception e) { + // TODO Auto-generated catch block + // System.out.println("Bild kann nicht geladen werden oder ist nicht korrekt"); + image = null; + } + + } + + public void setZoom(int z) { + zoom = z; + setDatei(file); + } + + public void setPos(int x, int y) { + posx = x; + posy = y; + repaint(); + } + + public Dimension getPreferredSize() + { + + if (file == null || image == null) + { + return new Dimension( 300, 200 ); + } + else + { + + return new Dimension( image.getWidth(this)+20,image.getHeight(this)+20); + + } + } + + public Dimension getMinimumSize() + { + return getPreferredSize(); + } + + + + public void keyPressed ( KeyEvent e){ + } + public void keyReleased ( KeyEvent e ){ + } + + public boolean isFocusable() { + return true; + } + +} diff --git a/Quellcodes/duc_bit_bmphexeditor/Datei.java b/Quellcodes/duc_bit_bmphexeditor/Datei.java new file mode 100644 index 0000000..0ea16c8 --- /dev/null +++ b/Quellcodes/duc_bit_bmphexeditor/Datei.java @@ -0,0 +1,291 @@ + import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.InputStreamReader; +import java.io.PrintStream; +import java.*; +import java.io.*; +import java.util.*; + + +public class Datei { + int ib = 0; + int iLength = 0; + byte buffer[] = new byte[10000000]; + byte searchBuffer[] = new byte[10000000]; + String dateiname = ""; + String pfad= ""; + + public Datei () { + dateiname = "unbenannt.txt"; + } + public Datei (File file) { + try { + FileInputStream inFile = new FileInputStream(file); + //BufferedReader inData = new BufferedReader(new InputStreamReader(inFile)); + + //if (inData.ready()) { + iLength = inFile.read(buffer); + for (int i=0; i< iLength; i++) searchBuffer[i]=0; + + //inData.close(); + inFile.close(); + dateiname = file.getName(); + pfad = file.getAbsolutePath(); + + //} else { + //System.out.println("Fehler beim Dateiöffnen"); + //} + } + catch (Exception ex) { + System.out.println("Fehler beim Dateiöffnen"); + } + + } + + public void saveFile(File file) { + try { + FileOutputStream outFile = new FileOutputStream(file); + //BufferedReader inData = new BufferedReader(new InputStreamReader(inFile)); + + //if (inData.ready()) { + outFile.write(buffer,0,iLength); + //inData.close(); + outFile.close(); + dateiname = file.getName(); + pfad = file.getAbsolutePath(); + + //} else { + //System.out.println("Fehler beim Dateiöffnen"); + //} + } + catch (Exception ex) { + System.out.println("Fehler beim Dateiöffnen"); + } + + } + + public String getFileName() + { + return dateiname; + } + + public String getPathName() + { + return dateiname; + } + + public byte[] getByteArray() + { + return buffer; + } + public String getByteBinary(int i) + { + String s = ""; + if (i= pos; i--) buffer[i+1]=buffer[i]; + buffer[pos]=0; + iLength++; + } + public void deleteByte(int pos) { + for (int i=pos; i< iLength; i++) buffer[i]=buffer[i+1]; + buffer[iLength]=0; + iLength--; + } + + + public int search(String s, int modus) { + byte searchBytes[] = new byte[50]; + int searchLength = 0; + int i, treffer, laenge=0; + + for (i=0; i< iLength;i++) searchBuffer[i]=0; + i = 0; + + if (modus==1) laenge = 8; + if (modus==2) laenge = 2; + if (modus==3) laenge = 1; + + while(s.length() >= laenge) { + if (modus==1) { + searchBytes[i] = (byte) Integer.parseInt(s.substring(0,8),2); + } + if (modus==2) { + searchBytes[i] = (byte) Integer.parseInt(s.substring(0,2),16); + } + if (modus==3) { + searchBytes[i] = (byte) s.charAt(0); + } + if (s.length()>laenge) { + s = s.substring(laenge); + } else s = ""; + i++; + } + searchLength = i; + + if (s.length()==0) { + treffer=0; + for(int j = 0; j< iLength-searchLength; j++) + { + int gefunden = 1; + for (i = 0; (i < searchLength) && (gefunden==1); i++) + { + if (buffer[j+i]!= searchBytes[i]) gefunden = 0; + } + + if (gefunden==1) { + for (i=0; i='0' && k.getKeyChar()<='1') modifyByte(k.getKeyChar()); + break; + } + case 2: { + if (k.getKeyChar()>='0' && k.getKeyChar()<='9') modifyByte(k.getKeyChar()); + if (k.getKeyChar()>='a' && k.getKeyChar()<='f') modifyByte(k.getKeyChar()); + if (k.getKeyChar()>='A' && k.getKeyChar()<='F') modifyByte(k.getKeyChar()); + break; + } + default: { + if (k.getKeyCode()!= 127) modifyByte(k.getKeyChar()); + } + } + } + } + + class myMouseListener implements MouseListener + { + public void mouseClicked( MouseEvent m ) + { + moveToMousePos(m.getX(),m.getY() ); + } + public void mouseExited(MouseEvent e) { + } + public void mouseEntered(MouseEvent e) { + } + public void mousePressed(MouseEvent e) { + // System.out.println("Test"); + } + public void mouseReleased(MouseEvent e) { + } + + + } + + public Edit(BMPHexEditor p){ + super(); + parent = p; + file = null; + pos = 0; + subpos = 0; + addKeyListener(new myKeyListener()); + addMouseListener(new myMouseListener()); + modus = 1; + } + + public void adjustTextMetrics() + { + int iWidth = getSize().width; + int iHeight = getSize().height; + Graphics g = getGraphics(); + + g.setFont(new Font("Monospaced",Font.PLAIN,12)); + FontMetrics fm = g.getFontMetrics( g.getFont() ); + + hoehe = fm.getHeight(); + switch (modus) { + case 1: breite = fm.stringWidth("01010101")+4; luecke = 4; anzahl = 8; + break; + case 2: breite = fm.stringWidth("FF")+4; luecke = 4; anzahl = 2; + break; + default : breite = fm.stringWidth("F"); luecke = 0; anzahl = 1; + } + + proZeile = iWidth / breite; + } + + public void paint(Graphics g){ + String s; + int iWidth = getSize().width; + int iHeight = getSize().height; + + Rectangle r = getVisibleRect(); + + adjustTextMetrics(); + + g.setFont(new Font("Monospaced",Font.PLAIN,12)); + g.setColor( Color.black ); + int zeile, spalte; + + if (file != null) { + + // BMP-Bild interpretieren + String info; + int bilddaten = file.getDWORD(10); + int bbreite = file.getDWORD(18); + int bhoehe = file.getDWORD(22); + int farbtiefe = file.getWORD(28); + int compression = 0; + int min = 0; int max = -1; + int xx = -1; int yy = -1; + + + switch (pos) { + case 0: case 1: + info = "Byte 1+2 immer 'BM' zur Kennzeichnung eines BMP-Bildes"; + min = 0; max = 1; + break; + case 2: case 3: case 4: case 5: + int i = file.getDWORD(2); + info = "Byte 3-6 Dateigröße: "+i+" Bytes (unsicher)"; + min = 2; max = 5; + break; + case 6: case 7: case 8: case 9: + info = "Byte 7-10 reservierte Bytes (keine Bedeutung)"; + min = 6; max = 9; + break; + case 10: case 11: case 12: case 13: + info = "Byte 11-14 Bilddaten beginnen bei Byte Nr. "+bilddaten; + min = 10; max = 13; + break; + case 14: case 15: case 16: case 17: + i = file.getDWORD(14); + info = "Byte 15-18 Größe des Headers: "+i+" Byte"; + min = 14; max = 17; + break; + case 18: case 19: case 20: case 21: + info = "Byte 19-22 Breite des Bildes: "+bbreite+" Pixel"; + min = 18; max = 21; + break; + case 22: case 23: case 24: case 25: + if (bhoehe<0) { + info = "Byte 23-26 Höhe des Bildes: "+(-bhoehe)+" Pixel und Top-Down-Bitmap"; + } else { + info = "Byte 23-26 Höhe des Bildes: "+bhoehe+" Pixel und Bottum-Up-Bitmap"; + } + min = 22; max = 25; + break; + case 28: case 29: + if (farbtiefe<=8) { + info = "Byte 29+30: Farbtiefe "+farbtiefe+" Bit pro Pixel mit Farbpalette"; + } + else { + info = "Byte 29+30: Farbtiefe "+farbtiefe+" Bit pro Pixel ohne Farbpalette"; + } + min = 28; max = 29; + break; + case 30: case 31: case 32: case 33: + compression = file.getDWORD(30); + if (compression == 0) { + info = "Byte 31-34: Komprimierung: Die Bilddaten sind unkomprimiert"; + } + else { + info = "Byte 31-34: Komprimierung: Die Bilddaten sind RunLength komprimiert"; + } + min = 30; max = 33; + break; + case 34: case 35: case 36: case 37: + i = file.getDWORD(34); + info = "Byte 35-38 Größe der Bilddaten: "+i+" Byte (kann auch 0 sein)"; + min = 34; max = 37; + break; + case 38: case 39: case 40: case 41: + i = file.getDWORD(38); + info = "Byte 39-42 Horizontale Auflösung "+i+" Pixel pro Meter (meist 0 gesetzt)"; + min = 38; max = 41; + break; + case 42: case 43: case 44: case 45: + i = file.getDWORD(42); + info = "Byte 43-46 Vertikale Auflösung "+i+" Pixel pro Meter (meist 0 gesetzt)"; + min = 42; max = 45; + break; + case 46: case 47: case 48: case 49: + i = file.getDWORD(38); + info = "Byte 47-50 Anzahl der Farben in der Palette "+i+" (0 = maximale Anzahl)"; + min = 46; max = 49; + break; + case 50: case 51: case 52: case 53: + i = file.getDWORD(38); + info = "Byte 51-54 Anzahl der benutzten Farben im Bild "+i+" (0 = alle Farben)"; + min = 50; max = 53; + break; + + default: + info = "sonstige Daten"; + if (pos >= 54 && pos < bilddaten) { + min = max = pos; + min = min -(pos-54) % 4; + max = max + 3-(pos-54) % 4; + + info = "Byte "+(pos+1)+" Farbe Nr. "+(pos-54)/4+" der Palette "; + if ((pos-54) % 4==0) { + info = info + " (Blauanteil)"; + } + if ((pos-54) % 4==1) { + info = info + " (Grünanteil)"; + } + if ((pos-54) % 4==2) { + info = info + " (Rotanteil)"; + } + if ((pos-54) % 4==3) { + info = info + " (immer 0)"; + } + } + if (pos >= bilddaten) { + min = max = pos; + // immer auf 4 Byte mit Nullen aufgefüllt + int bbreite_angepasst = bbreite*farbtiefe/8+3; + bbreite_angepasst = bbreite_angepasst - bbreite_angepasst % 4; + + yy = (pos-bilddaten) / bbreite_angepasst +1; + int pos_in_zeile = ((pos-bilddaten) - (yy-1)*bbreite_angepasst); + xx = pos_in_zeile*8 / farbtiefe +1; + if (bhoehe > 0) { + yy = bhoehe - yy +1; + } + if (farbtiefe == 1) { + info = "Byte "+(pos+1)+" Farbenummer des Pixels an Pos ("+xx+"/"+yy+") und der nächsten 7 Pixel"; + } + if (farbtiefe == 2) { + info = "Byte "+(pos+1)+" Farbenummer des Pixels an Pos ("+xx+"/"+yy+") und der nächsten 3 Pixel"; + } + if (farbtiefe == 4) { + info = "Byte "+(pos+1)+" Farbnummer des Pixels an Pos ("+xx+"/"+yy+") und des nächsten Pixels"; + } + if (farbtiefe == 8) { + info = "Byte "+(pos+1)+" Farbnummer des Pixels an Pos ("+xx+"/"+yy+")"; + } + if (farbtiefe > 8) { + info = "Byte "+(pos+1)+" Farbe des Pixels an Pos ("+xx+"/"+yy+")"; + if ((pos_in_zeile) % 3==0) { + info = info + " (Blauanteil)"; + } + if ((pos_in_zeile) % 3==1) { + info = info + " (Grünanteil)"; + } + if ((pos_in_zeile) % 3==2) { + info = info + " (Rotanteil)"; + } + min = min -(pos_in_zeile) % 3; + max = max + 2-(pos_in_zeile) % 3; + } + if (xx > bbreite) { // Dummybytes + info = "Byte "+(pos+1)+" keine Bedeutung"; + min = max = pos; + } + parent.posChanged(xx,yy); + + } + } + + + int laenge = file.getLength(); + + zeile = 0; + spalte = 0; + + int start = (int)(r.getY() / hoehe) * proZeile; + int ende = ((int) ((r.getY()+r.getHeight()) / hoehe)+1)*proZeile; + zeile = (int) (r.getY() / hoehe); + spalte = 0; + for (int i=start; i=min && i<=max) { + g.setColor( Color.lightGray); + g.fillRect((spalte)*breite+luecke/2,4+(zeile)*hoehe,breite-luecke/2-1,hoehe); + g.setColor( Color.black); + } + + if (i==pos) { + g.setColor( Color.yellow); + g.fillRect((spalte)*breite+luecke/2,4+(zeile)*hoehe,breite-luecke/2-1,hoehe); + if (subpos != 0) { + g.setColor( Color.red); + g.fillRect((spalte)*breite+subpos*(breite-luecke)/anzahl+luecke/2,4+(zeile)*hoehe,(breite-luecke/2)/anzahl-1,hoehe); + } + g.setColor( Color.black); + } + switch (modus) { + case 1: s = file.getByteBinary(i); + break; + case 2: s = file.getByteHex(i); + break; + default : s = file.getByteChar(i); + + } + g.drawString(s,(spalte)*breite+luecke/2,hoehe+(zeile)*hoehe); + spalte++; + + if (spalte >= proZeile) { + zeile++; + spalte = 0; + } + } + + if (pos leeres Rechteck zeichnen + g.setColor( Color.lightGray); + g.fillRect((spalte)*breite+luecke/2,4+(zeile)*hoehe,breite-luecke/2-1,hoehe); + g.setColor( Color.black); + } + + parent.showLabels(file.getByteBinary(pos), file.getByteHex(pos), file.getByteChar(pos),info); + } + } + + public void setDatei(Datei file) { + this.file = file; + pos = 0; + subpos = 0; + } + + public Datei getDatei(){ + return file; + } + + public Dimension getPreferredSize() + { + adjustTextMetrics(); + + if (file == null) + { + return new Dimension( 300, 200 ); + } + else + { + int laenge = file.getLength(); + + int komponentenhoehe = hoehe+(laenge/proZeile)*hoehe+5; + if (komponentenhoehe < 200) { + komponentenhoehe = 200; + } + return new Dimension( 300, komponentenhoehe); + + } + } + + public Dimension getMinimumSize() + { + return getPreferredSize(); + } + + public void setMode( int i) { + modus = i; + subpos = 0; + repaint(); + } + + public void setUeberschreiben(int i) { + ueberschreiben = i; + } + + public int getUeberschreiben() { + return ueberschreiben; + } + + public void movePos ( int i ){ + if (file!=null) { + subpos = 0; + pos += i; + if (pos < 0) pos = 0; + if (pos > file.getLength()) pos = file.getLength(); + repaint(); + } + } + + public void moveToMousePos(int x, int y) { + if (file!=null) { + pos = (y / hoehe)*proZeile + (x / breite); + subpos = 0; + if (pos < 0) pos = 0; + if (pos > file.getLength()) pos = file.getLength(); + repaint(); + } + } + + public void moveToPos(int x, int y) { + int bilddaten = file.getDWORD(10); + int bbreite = file.getDWORD(18); + int bhoehe = file.getDWORD(22); + int farbtiefe = file.getWORD(28); + if (bhoehe > 0) { + pos = (bhoehe - y)*bbreite +x-1; + } + else { + pos = (y-1)*bbreite + x-1; + } + pos = pos * farbtiefe / 8; + pos += bilddaten; + + parent.scrollTo(0, pos / proZeile * hoehe - 100); + repaint(); + + } + + public int compare(File vergleichDatei) { + int gefunden = -1; + if (file!=null) + { + gefunden = file.compare(vergleichDatei); + } + repaint(); + return gefunden; + } + + + public int search(String s) { + int gefunden = -1; + if (file!=null) + { + String s2=""; + char b; + for (int i = 0; i < s.length(); i++) + { + b = s.charAt(i); + if (modus==1 && (b == '0' || b == '1')) s2 = s2 + b; + if (modus==2 && ((b >= '0' && b <= '9')|| (b>='A' && b <='F') || (b>='a' && b<='f'))) s2 = s2+b; + if (modus==3) s2 = s2+b; + } + if (modus==2) s2 = s2.toUpperCase(); + if (s2.length()>0) gefunden = file.search(s2,modus); + } + repaint(); + return gefunden; + } + + public void delete( int i) { + if (file != null && pos+i>0 && pos+i file.getLength()) pos--; + } + repaint(); + } + + public void modifyByte( char c ) { + String s; + if (file != null) { + if (pos == file.getLength() || (subpos == 0 && !(ueberschreiben==1))) file.insertByte(pos); + + switch (modus) { + case 1: s = file.getByteBinary(pos); + break; + case 2: s = file.getByteHex(pos); + break; + default : s = file.getByteChar(pos); + } + + + s = s.substring(0,subpos)+c+s.substring(subpos+1); + subpos++; + + int maxSubpos; + switch (modus) { + case 1: maxSubpos = 7; + file.setByteBinary(pos,s); + break; + case 2: maxSubpos = 1; + file.setByteHex(pos,s); + break; + default : maxSubpos = 0; + file.setByteChar(pos,c); + } + + if (subpos > maxSubpos) + { + subpos = 0; + movePos(1); + } + repaint(); + parent.fileChanged(); + } + } + + public void keyPressed ( KeyEvent e){ + } + public void keyReleased ( KeyEvent e ){ + } + + public boolean isFocusable() { + return true; + } + +} \ No newline at end of file diff --git a/Quellcodes/duc_bit_bmphexeditor/readme.adoc b/Quellcodes/duc_bit_bmphexeditor/readme.adoc new file mode 100644 index 0000000..e8b8ed3 --- /dev/null +++ b/Quellcodes/duc_bit_bmphexeditor/readme.adoc @@ -0,0 +1,12 @@ += Material : Hexeditor + +|=== +|Zuordnung| Daten und Codierung +|Klassenstufe| ab Klasse 7 +|Bildungsplanbezug | Codierung von Bildern +|Werkzeug| Hexeditor-Quellcodes +|Autoren| Thomas Schaller +|=== + +== Inhalt +Dieses Programm stellt BMP-Dateien in Form von Bits dar. Es kann genutzt werden, um deutlich zu machen, dass auch Bilder aus Bits bestehen. Beim Anklicken einzelner Pixel werden die dazugehörigen Bits markiert. Werden die Bits verändert, ändert sich das Bild synchron. Im Gegensatz zu üblichen Hexeditoren werden die Daten binär dargestellt (Hexadezimal oder als Text ist aber auch verfügbar.) diff --git a/Quellcodes/duc_bit_hexeditor/.gitignore b/Quellcodes/duc_bit_hexeditor/.gitignore new file mode 100644 index 0000000..c1f4551 --- /dev/null +++ b/Quellcodes/duc_bit_hexeditor/.gitignore @@ -0,0 +1,5 @@ +*.class +*.ctxt +*.sh +repo.adoc +*.~lock diff --git a/Quellcodes/duc_bit_hexeditor/Datei.java b/Quellcodes/duc_bit_hexeditor/Datei.java new file mode 100644 index 0000000..39a1fdc --- /dev/null +++ b/Quellcodes/duc_bit_hexeditor/Datei.java @@ -0,0 +1,274 @@ +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.InputStreamReader; +import java.io.PrintStream; +import java.*; +import java.io.*; +import java.util.*; + + +public class Datei { + int ib = 0; + int iLength = 0; + byte buffer[] = new byte[1000000]; + byte searchBuffer[] = new byte[1000000]; + String dateiname = ""; + String pfad= ""; + + public Datei () { + dateiname = "unbenannt.txt"; + } + public Datei (File file) { + try { + buffer = new byte[(int) file.length()+100000]; + searchBuffer = new byte[(int) file.length()+100000]; + FileInputStream inFile = new FileInputStream(file); + //BufferedReader inData = new BufferedReader(new InputStreamReader(inFile)); + + //if (inData.ready()) { + iLength = inFile.read(buffer); + for (int i=0; i< iLength; i++) searchBuffer[i]=0; + + //inData.close(); + inFile.close(); + dateiname = file.getName(); + pfad = file.getAbsolutePath(); + + //} else { + //System.out.println("Fehler beim Dateiöffnen"); + //} + } + catch (Exception ex) { + System.out.println("Fehler beim Dateiöffnen"); + } + + } + + public void saveFile(File file) { + try { + FileOutputStream outFile = new FileOutputStream(file); + //BufferedReader inData = new BufferedReader(new InputStreamReader(inFile)); + + //if (inData.ready()) { + outFile.write(buffer,0,iLength); + //inData.close(); + outFile.close(); + dateiname = file.getName(); + pfad = file.getAbsolutePath(); + + //} else { + //System.out.println("Fehler beim Dateiöffnen"); + //} + } + catch (Exception ex) { + System.out.println("Fehler beim Dateiöffnen"); + } + + } + + public String getFileName() + { + return dateiname; + } + + public String getPathName() + { + return dateiname; + } + + public String getByteBinary(int i) + { + String s = ""; + if (i= pos; i--) buffer[i+1]=buffer[i]; + buffer[pos]=0; + iLength++; + } + public void deleteByte(int pos) { + for (int i=pos; i< iLength; i++) buffer[i]=buffer[i+1]; + buffer[iLength]=0; + iLength--; + } + + + public int search(String s, int modus) { + byte searchBytes[] = new byte[50]; + int searchLength = 0; + int i, treffer, laenge=0; + + for (i=0; i< iLength;i++) searchBuffer[i]=0; + i = 0; + + if (modus==1) laenge = 8; + if (modus==2) laenge = 2; + if (modus==3) laenge = 1; + + while(s.length() >= laenge) { + if (modus==1) { + searchBytes[i] = (byte) Integer.parseInt(s.substring(0,8),2); + } + if (modus==2) { + searchBytes[i] = (byte) Integer.parseInt(s.substring(0,2),16); + } + if (modus==3) { + searchBytes[i] = (byte) s.charAt(0); + } + if (s.length()>laenge) { + s = s.substring(laenge); + } else s = ""; + i++; + } + searchLength = i; + + if (s.length()==0) { + treffer=0; + for(int j = 0; j< iLength-searchLength; j++) + { + int gefunden = 1; + for (i = 0; (i < searchLength) && (gefunden==1); i++) + { + if (buffer[j+i]!= searchBytes[i]) gefunden = 0; + } + + if (gefunden==1) { + for (i=0; i='0' && k.getKeyChar()<='1') modifyByte(k.getKeyChar()); + break; + } + case 2: { + if (k.getKeyChar()>='0' && k.getKeyChar()<='9') modifyByte(k.getKeyChar()); + if (k.getKeyChar()>='a' && k.getKeyChar()<='f') modifyByte(k.getKeyChar()); + if (k.getKeyChar()>='A' && k.getKeyChar()<='F') modifyByte(k.getKeyChar()); + break; + } + default: { + if (k.getKeyCode()!= 127) modifyByte(k.getKeyChar()); + } + } + } + } + + class myMouseListener implements MouseListener + { + public void mouseClicked( MouseEvent m ) + { + moveToMousePos(m.getX(),m.getY() ); + } + public void mouseExited(MouseEvent e) { + } + public void mouseEntered(MouseEvent e) { + } + public void mousePressed(MouseEvent e) { + } + public void mouseReleased(MouseEvent e) { + } + + + } + + public Edit(HexEditor p){ + super(); + parent = p; + file = null; + pos = 0; + subpos = 0; + addKeyListener(new myKeyListener()); + addMouseListener(new myMouseListener()); + modus = 1; + } + + public void adjustTextMetrics() + { + int iWidth = getSize().width; + int iHeight = getSize().height; + Graphics g = getGraphics(); + + g.setFont(new Font("Monospaced",Font.PLAIN,12)); + FontMetrics fm = g.getFontMetrics( g.getFont() ); + + hoehe = fm.getHeight(); + switch (modus) { + case 1: breite = fm.stringWidth("01010101")+4; luecke = 4; anzahl = 8; + break; + case 2: breite = fm.stringWidth("FF")+4; luecke = 4; anzahl = 2; + break; + default : breite = fm.stringWidth("F"); luecke = 0; anzahl = 1; + } + + proZeile = iWidth / breite; + } + + public void paint(Graphics g){ + String s; + int iWidth = getSize().width; + int iHeight = getSize().height; + + Rectangle r = getVisibleRect(); + + adjustTextMetrics(); + + g.setFont(new Font("Monospaced",Font.PLAIN,12)); + g.setColor( Color.black ); + int zeile, spalte; + + if (file != null) { + + int laenge = file.getLength(); + + + int start = (int)(r.getY() / hoehe) * proZeile; + int ende = ((int) ((r.getY()+r.getHeight()) / hoehe)+1)*proZeile; + zeile = (int) (r.getY() / hoehe); + spalte = 0; + for (int i=start; i= proZeile) { + zeile++; + spalte = 0; + } + } + + if (pos leeres Rechteck zeichnen + g.setColor( Color.lightGray); + g.fillRect((spalte)*breite+luecke/2,4+(zeile)*hoehe,breite-luecke/2-1,hoehe); + g.setColor( Color.black); + } + parent.showLabels(file.getByteBinary(pos), file.getByteHex(pos), file.getByteChar(pos), pos+1); + } + } + + public void setDatei(Datei file) { + this.file = file; + pos = 0; + subpos = 0; + } + + public Datei getDatei(){ + return file; + } + + public Dimension getPreferredSize() + { + adjustTextMetrics(); + + if (file == null) + { + return new Dimension( 300, 200 ); + } + else + { + int laenge = file.getLength(); + + int komponentenhoehe = hoehe+(laenge/proZeile)*hoehe+5; + if (komponentenhoehe < 200) { + komponentenhoehe = 200; + } + return new Dimension( 300, komponentenhoehe); + + } + } + + public Dimension getMinimumSize() + { + return getPreferredSize(); + } + + public void setMode( int i) { + modus = i; + subpos = 0; + repaint(); + } + + public void setUeberschreiben(int i) { + ueberschreiben = i; + } + + public int getUeberschreiben() { + return ueberschreiben; + } + + public void movePos ( int i ){ + if (file!=null) { + subpos = 0; + pos += i; + if (pos > file.getLength()) pos = file.getLength(); + if (pos < 0) pos = 0; + repaint(); + + } + } + + public void moveToMousePos(int x, int y) { + if(file!=null) { + pos = (y / hoehe)*proZeile + (x / breite); + subpos = 0; + if (pos > file.getLength()) pos = file.getLength(); + if (pos < 0) pos = 0; + repaint(); + } + } + + public int compare(File vergleichDatei) { + int gefunden = -1; + if (file!=null) + { + gefunden = file.compare(vergleichDatei); + } + repaint(); + return gefunden; + } + + + public int search(String s) { + int gefunden = -1; + if (file!=null) + { + String s2=""; + char b; + for (int i = 0; i < s.length(); i++) + { + b = s.charAt(i); + if (modus==1 && (b == '0' || b == '1')) s2 = s2 + b; + if (modus==2 && ((b >= '0' && b <= '9')|| (b>='A' && b <='F') || (b>='a' && b<='f'))) s2 = s2+b; + if (modus==3) s2 = s2+b; + } + if (modus==2) s2 = s2.toUpperCase(); + if (s2.length()>0) gefunden = file.search(s2,modus); + } + repaint(); + return gefunden; + } + + public void delete( int i) { + if (file != null && pos+i>0 && pos+i file.getLength()) pos--; + } + repaint(); + } + + public void modifyByte( char c ) { + String s; + if (file!= null) { + if (pos == file.getLength() || (subpos == 0 && !(ueberschreiben==1))) file.insertByte(pos); + + switch (modus) { + case 1: s = file.getByteBinary(pos); + break; + case 2: s = file.getByteHex(pos); + break; + default : s = file.getByteChar(pos); + } + + + s = s.substring(0,subpos)+c+s.substring(subpos+1); + subpos++; + + int maxSubpos; + switch (modus) { + case 1: maxSubpos = 7; + file.setByteBinary(pos,s); + break; + case 2: maxSubpos = 1; + file.setByteHex(pos,s); + break; + default : maxSubpos = 0; + file.setByteChar(pos,c); + } + + if (subpos > maxSubpos) + { + subpos = 0; + movePos(1); + } + repaint(); + + } + } + + public void keyPressed ( KeyEvent e){ + } + public void keyReleased ( KeyEvent e ){ + } + + public boolean isFocusable() { + return true; + } + +} diff --git a/Quellcodes/duc_bit_hexeditor/HexEditor.jar b/Quellcodes/duc_bit_hexeditor/HexEditor.jar new file mode 100644 index 0000000000000000000000000000000000000000..5a86222096dec20ab089bbe67e2fcf55c7908f5b GIT binary patch literal 20800 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

rb|73~7=bYzQI9UTh@yCp#)Ht_!TB`?5}@J2&!` zgBk)4SZtf(H^SXx8+%Oum7se}Sbvv^37W`6QDEb!qktYV;0l6%FknA{ zpdV~YLmQ`nwlGl;I6^I`FW6G(&VMg65M2d0Oe+|--jd9ozgPK(;cL-#fKg?^=E$)d0^Z``0>?_0{MTzfyoA8yyzGZ-%O~8-W_P73*!;GKzuU{ zA&LX-Sz+8p4~TF2?xHx*3lzqo$AS2!qbrI7-6mmN3nYk+@a->Gh^n~& literal 0 HcmV?d00001 diff --git a/Quellcodes/duc_bit_hexeditor/HexEditor.java b/Quellcodes/duc_bit_hexeditor/HexEditor.java new file mode 100644 index 0000000..c6add57 --- /dev/null +++ b/Quellcodes/duc_bit_hexeditor/HexEditor.java @@ -0,0 +1,287 @@ +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; +import javax.swing.border.EtchedBorder; +import java.io.*; + + +/** + * + * Beschreibung + * + * @version 1.0 vom 6.12.2009 + * @author + */ + +public class HexEditor extends JFrame { + // Anfang Attribute + private JMenuBar mb = new JMenuBar(); + private JMenu fileMenu = new JMenu("Datei"); + private JMenu editMenu = new JMenu("Bearbeiten"); + private JMenu viewMenu = new JMenu("Ansicht"); + private JMenu infoMenu = new JMenu("Info"); + private static JFileChooser dateiauswahldialog = new JFileChooser(System.getProperty("user.dir")); + private Edit eingabe = new Edit(this); + private JScrollPane scrollPane = new JScrollPane(eingabe); + private JPanel infoPane = new JPanel(); + private JLabel binLabel = new JLabel(" "); + private JLabel hexLabel = new JLabel(" "); + private JLabel ascLabel = new JLabel(" "); + private JLabel posLabel = new JLabel(" "); + private JLabel posTitle = new JLabel("Byte Nr.:"); + private JLabel binTitle = new JLabel("Binär:"); + private JLabel hexTitle = new JLabel("Hexadezimal:"); + private JLabel ascTitle = new JLabel("ASCII-Code:"); + private JPanel titelPane = new JPanel(); + private JLabel dateiname = new JLabel(""); + private JLabel modus = new JLabel("Überschreibmodus"); + private JMenuItem modeAction = new JMenuItem("Einfügemodus wählen"); + + // Ende Attribute + + public HexEditor(String title) { + // Frame-Initialisierung + super(title); + addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent evt) { System.exit(0); } + }); + + int frameWidth = 800; + int frameHeight = 500; + setSize(frameWidth, frameHeight); + Dimension d = Toolkit.getDefaultToolkit().getScreenSize(); + int x = (d.width - getSize().width) / 2; + int y = (d.height - getSize().height) / 2; + setLocation(x, y); + Container cp = getContentPane(); + // Anfang Komponenten + setLayout(new BorderLayout()); + + setJMenuBar(mb); + mb.add(fileMenu); + mb.add(editMenu); + mb.add(viewMenu); + mb.add(infoMenu); + + // Create and add simple menu item to one of the drop down menu + JMenuItem newAction = new JMenuItem("Neu"); + JMenuItem openAction = new JMenuItem("Öffnen"); + JMenuItem saveAction = new JMenuItem("Speichern"); + JMenuItem saveasAction = new JMenuItem("Speichern unter"); + JMenuItem exitAction = new JMenuItem("Beenden"); + JMenuItem searchAction = new JMenuItem("Suchen"); + JMenuItem compareAction = new JMenuItem("Dateivergleich"); + JMenuItem binAction = new JMenuItem("Binärdarstellung"); + JMenuItem hexAction = new JMenuItem("Hexadezimaldarstellung"); + JMenuItem ascAction = new JMenuItem("ASCII-Darstellung"); + JMenuItem infoAction = new JMenuItem("Info"); + + fileMenu.add(newAction); + fileMenu.add(openAction); + fileMenu.add(saveAction); + fileMenu.addSeparator(); + fileMenu.add(exitAction); + editMenu.add(searchAction); + editMenu.add(compareAction); + editMenu.addSeparator(); + editMenu.add(modeAction); + viewMenu.add(binAction); + viewMenu.add(hexAction); + viewMenu.add(ascAction); + infoMenu.add(infoAction); + + newAction.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent arg0) { + eingabe.setDatei(new Datei()); + dateiname.setText("unbenannt.txt"); + pack(); + repaint(); + } + }); + + openAction.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + openFile(); + } + }); + + saveAction.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + saveFile(); + } + }); + + + exitAction.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { System.exit(0); } + }); + + + searchAction.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { suchen();} + }); + + compareAction.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { vergleiche();} + }); + + modeAction.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { changeUeberschreiben();} + }); + + binAction.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { eingabe.setMode(1); + scrollPane.getViewport().setView(eingabe); + } + }); + hexAction.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { eingabe.setMode(2); + scrollPane.getViewport().setView(eingabe); + } + }); + ascAction.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { eingabe.setMode(3); + scrollPane.getViewport().setView(eingabe); + } + }); + + infoAction.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent evt) { + JOptionPane.showMessageDialog(null, "Autor: T. Schaller Version: April 2013", "Information", JOptionPane.INFORMATION_MESSAGE); + } + }); + + scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); + scrollPane.setPreferredSize(new Dimension(800,450)); + scrollPane.setBorder(BorderFactory.createEtchedBorder()); + cp.add(scrollPane,BorderLayout.CENTER); + + infoPane.setLayout(new BoxLayout(infoPane, BoxLayout.LINE_AXIS)); + infoPane.setBorder(BorderFactory.createEmptyBorder(0,5,3,5)); + infoPane.add(posTitle); + infoPane.add(Box.createRigidArea(new Dimension(3, 0))); + infoPane.add(posLabel); + infoPane.add(Box.createRigidArea(new Dimension(30, 0))); + infoPane.add(binTitle); + infoPane.add(Box.createRigidArea(new Dimension(3, 0))); + infoPane.add(binLabel); + infoPane.add(Box.createRigidArea(new Dimension(30, 0))); + infoPane.add(hexTitle); + infoPane.add(Box.createRigidArea(new Dimension(3, 0))); + infoPane.add(hexLabel); + infoPane.add(Box.createRigidArea(new Dimension(30, 0))); + infoPane.add(ascTitle); + infoPane.add(Box.createRigidArea(new Dimension(3, 0))); + infoPane.add(ascLabel); + + cp.add(infoPane, BorderLayout.PAGE_END); + + titelPane.setLayout(new BoxLayout(titelPane, BoxLayout.LINE_AXIS)); + titelPane.setBorder(BorderFactory.createEmptyBorder(3,5,0,5)); + titelPane.add(dateiname); + titelPane.add(Box.createHorizontalGlue()); + titelPane.add(modus); + + cp.add(titelPane, BorderLayout.PAGE_START); + + // Ende Komponenten + + setResizable(true); + setVisible(true); + pack(); + eingabe.requestFocus(); + } + + // Anfang Methoden + public void showLabels(String bin, String hex, String asc, int pos) + { + binLabel.setText(bin); + hexLabel.setText(hex); + ascLabel.setText(asc); + posLabel.setText(""+pos); + } + + + public void openFile() { + int ergebnis = dateiauswahldialog.showOpenDialog(this); + + if(ergebnis != JFileChooser.APPROVE_OPTION) { // abgebrochen + return; + } + + Datei file = new Datei(dateiauswahldialog.getSelectedFile()); + eingabe.setDatei(file); + dateiname.setText(file.getFileName()); + scrollPane.getViewport().setView(eingabe); + repaint(); + } + + public void saveFile() { + Datei file = eingabe.getDatei(); + if (file != null) { + file = eingabe.getDatei(); + dateiauswahldialog.setSelectedFile(new File(file.getPathName())); + int ergebnis = dateiauswahldialog.showSaveDialog(this); + + if(ergebnis != JFileChooser.APPROVE_OPTION) { // abgebrochen + return; + } + + file.saveFile(dateiauswahldialog.getSelectedFile()); + dateiname.setText(file.getFileName()); + repaint(); + + } + } + + public void changeUeberschreiben() { + if (eingabe.getUeberschreiben()==1) { + eingabe.setUeberschreiben(0); + modeAction.setText("Überschreibemodus wählen"); + modus.setText("Einfügemodus"); + } + else { + eingabe.setUeberschreiben(1); + modeAction.setText("Einfügemodus wählen"); + modus.setText("Überschreibemodus"); + } + + } + + public void suchen() { + String s = JOptionPane.showInputDialog("Geben Sie bitte die gesuchten Bytes ein."); + if (s!=null) { + int erg = eingabe.search(s); + if (erg==-1) + JOptionPane.showMessageDialog(this,"Fehler bei der Suche. Es muss eine Datei geöffnet sein und es können immer nur ganze Bytes gesucht werden."); + if (erg==0) + JOptionPane.showMessageDialog(this,"Gesuchte Bytes wurden nicht gefunden."); + if (erg>0) + JOptionPane.showMessageDialog(this,"Gesuchte Bytes wurden "+erg+" mal gefunden."); + + } + } + + public void vergleiche() { + int ergebnis = dateiauswahldialog.showOpenDialog(this); + + if(ergebnis != JFileChooser.APPROVE_OPTION) { // abgebrochen + return; + } + + int erg = eingabe.compare(dateiauswahldialog.getSelectedFile()); + repaint(); + if (erg==-1) + JOptionPane.showMessageDialog(this,"Fehler beim Vergleich. Es muss eine Datei geöffnet sein."); + if (erg==0) + JOptionPane.showMessageDialog(this,"Keine Unterschiede gefunden."); + if (erg>0) + JOptionPane.showMessageDialog(this,""+erg+" Bytes unterscheiden sich."); + } + + // Ende Methoden + + public static void main(String[] args) { + new HexEditor("HexEditor"); + } +} diff --git a/Quellcodes/duc_bit_hexeditor/HexEditor.jfm b/Quellcodes/duc_bit_hexeditor/HexEditor.jfm new file mode 100644 index 0000000..192755c --- /dev/null +++ b/Quellcodes/duc_bit_hexeditor/HexEditor.jfm @@ -0,0 +1,43 @@ +object HexEditor: TFGUIFormular + Left = 4 + Top = 6 + BorderIcons = [biSystemMenu, biMinimize] + Caption = 'd:\tom\Informatik\Java\HexEditor\HexEditor.jfm' + ClientHeight = 205 + ClientWidth = 392 + Color = clBtnFace + Font.Charset = DEFAULT_CHARSET + Font.Color = clWindowText + Font.Height = -13 + Font.Name = 'MS Sans Serif' + Font.Style = [] + FormStyle = fsMDIChild + OldCreateOrder = True + Position = poDesigned + Visible = True + WindowState = wsMaximized + OnClose = FormClose + OnCloseQuery = FormCloseQuery + OnResize = FormResize + PixelsPerInch = 96 + TextHeight = 16 + object button1: TButton + Tag = 4 + Left = 224 + Top = 128 + Width = 75 + Height = 25 + Caption = 'button1' + TabOrder = 0 + end + object textArea1: TMemo + Tag = 3 + Left = 0 + Top = 24 + Width = 569 + Height = 81 + Lines.Strings = ( + 'textArea1') + TabOrder = 1 + end +end diff --git a/Quellcodes/duc_bit_hexeditor/readme.adoc b/Quellcodes/duc_bit_hexeditor/readme.adoc new file mode 100644 index 0000000..6070a98 --- /dev/null +++ b/Quellcodes/duc_bit_hexeditor/readme.adoc @@ -0,0 +1,12 @@ += Material : Hexeditor + +|=== +|Zuordnung| Daten und Codierung +|Klassenstufe| ab Klasse 7 +|Bildungsplanbezug | Codierung von Texten und Bildern +|Werkzeug| Hexeditor-Quellcodes +|Autoren| Thomas Schaller +|=== + +== Inhalt +Dieses Programm stellt jegliche Datei in Form von Bits dar. Es kann genutzt werden, um deutlich zu machen, dass auch Textdatei oder Bilder aus Bits bestehen. Im Gegensatz zu üblichen Hexeditoren werden die Daten binär dargestellt (Hexadezimal oder als Text ist aber auch verfügbar.)