tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von Fabio Hellmann
  • 1 Beitrag von Thomas Darimont
ERLEDIGT
JA
ANTWORTEN
6
ZUGRIFFE
333
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Ryu1991
    Ryu1991 Ryu1991 ist offline Mitglied Gold
    Registriert seit
    Dec 2007
    Beiträge
    241
    Hey,
    ich schreibe im moment eine Anwendung, bei der Ich viele Informationen über netzwerk verschicken muss, und zwar in Form von byte[].
    So kommt es dass ich relativ häufig Zahlen von short, oder int zu byte[] konvertieren muss.
    Ist ja von der Logik her kein Problem :

    Code java:
    1
    2
    3
    
    ...
    array[0] = my_short / 0x100;
    array[1] = my_short % 0x100;

    Aber, bei Ints wird das schon ganz schön mühseelig, weswegen ich mir dafür eine Funktion schreiben wollte, ungefähr so:

    (Peudocode, ^= hoch in dem fall)
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    package Utils;
     
    public class ByteConverter{
        public static <T> byte[] toByteArray(T number){
            short size = sizeof number;
            byte[] new_array = new byte[size];
            
            for(short i = 0;i < size; i++){
                new_array[i] = (byte) ((number % (0x10 ^ (size - i)) / (0x10^(size- i - 2)));
            }
            
            return new_array;
        }
    }

    Das ganze scheitert jetzt natürlich daran, dass ich kein sizeof, oder etwas vergleichbares gefunden habe.

    Deswegen meine Frage an euch, wie kann ich dieses Problem lösen, ohne für short, int und double einzelne Methoden anzulegen?
     
    "2 Dinge sind Unendlich, die Menschliche Dummheit und das Universum, bei 2tem bin ich mir noch nicht ganz sicher", Albert Einstein
    "Wenn man keine Ahnung hat, einfach mal Fresse halten", Dieter Nuhr

  2. #2
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist offline Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Hi,
    du kannst z.B. mit Number arbeiten.
    Oder du übergibst ein ? number und suchst dir dann den richtigen Typen mit if-Bedingung raus.
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    public static byte[] toByteArray(? number){
            byte[] new_array = new byte[size];
            if(number instanceof ...) {
     
            } else if(number instanceof ...) {
     
            }
            return new_array;
        }
    Eine andere Möglichkeit wäre, dass du einfach jede Zahl in einen Long-Wert castest. Das würde wahrscheinlich am leichtesten, schnellsten und mit dem wenigsten Aufwand gehen.

    Gruß

    Fabio
    Ryu1991 bedankt sich. 
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  3. #3
    Avatar von Ryu1991
    Ryu1991 Ryu1991 ist offline Mitglied Gold
    Registriert seit
    Dec 2007
    Beiträge
    241
    Hey, danke schonmal für die Antwort,
    Also das mit dem ? sieht zwar cool aus, aber Eclipse sagt mir, dass das nicht geht.
    funktioniert instanceof auch mit T oder, oder kommt dann immer false raus, außer ich mache instanceof(T) ?

    In Long casten geht nicht, weil ich wenn ich ein short übergebe auch nur ein 2byte großes array zurückmöchte, und kein 8byte großes.
     
    "2 Dinge sind Unendlich, die Menschliche Dummheit und das Universum, bei 2tem bin ich mir noch nicht ganz sicher", Albert Einstein
    "Wenn man keine Ahnung hat, einfach mal Fresse halten", Dieter Nuhr

  4. #4
    Avatar von j2se
    j2se j2se ist offline Mitglied Silber
    Registriert seit
    Oct 2011
    Beiträge
    94
    Blog-Einträge
    1
    hallo Ryu1991
    Mein Vorschlag ist das Argument als Typ ArrayList<Byte> zu verwenden, da die ArrayList auch die Methode size() unterstützt. Falls Du ein Array benötigst, kannst Du dann immer noch

    Byte[] byteArray = new Byte[list.size()];
    byteArray = list.toArray(byteArray);

    ausführen, um die ArrayList namens list in ein Byte-Array zu konvertieren.
     

  5. #5
    Avatar von Ryu1991
    Ryu1991 Ryu1991 ist offline Mitglied Gold
    Registriert seit
    Dec 2007
    Beiträge
    241
    Und wie soll ich dann da nen Int, Short, oder double reinbekommen?
    Und wie sieht das Byte-Array aus, wenn ichs zurück kriege, weil das muss ziemlich genauen Regeln unterliegen

    Also ich habe jetzt das:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    package Utils;
     
    public class ByteConverter{
        public static <T> byte[] toByteArray(T number){
            short size = 0;
            
            if(number instanceof Double) size = 8;
            if(number instanceof Integer) size = 4;
            if(number instanceof Short) size = 2;
            if(number instanceof Byte) size = 1;
            else{
                String s = "Du hast ByteConverter.toByteArray einen Illegalen Typ übergeben, idiot";
                DebugPrinter.getInstance().println(s);
                throw new Exception(s);
            }
            
            byte[] array = new byte[size];
            
            for(int i = 0; i < size; i++){
                array[i] = (byte) ((number % Math.pow(0x100, size-i)) / Math.pow(0x100, size-i - 1));
            }
        }
    }
    Aber jetzt funktioniert der Modulo-Operator nicht bei bei Number.
    Kann man das vllt irgendwie dynamisch umcasten?
    Geändert von Ryu1991 (25.01.12 um 16:04 Uhr)
     
    "2 Dinge sind Unendlich, die Menschliche Dummheit und das Universum, bei 2tem bin ich mir noch nicht ganz sicher", Albert Einstein
    "Wenn man keine Ahnung hat, einfach mal Fresse halten", Dieter Nuhr

  6. #6
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    schau mal hier:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    
    package de.tutorials;
     
    import java.nio.ByteBuffer;
    import java.util.Arrays;
     
    public class ByteArrayConversionExample {
        public static void main(String[] args) {
            System.out.println(Arrays.toString(toBytes(123))        + " ===> " + fromBytes(toBytes(123), int.class));
            System.out.println(Arrays.toString(toBytes(123L))       + " ===> " + fromBytes(toBytes(123L), long.class));
            System.out.println(Arrays.toString(toBytes((byte)123))  + " ===> " + fromBytes(toBytes((byte)123), byte.class));
            System.out.println(Arrays.toString(toBytes((short)123)) + " ===> " + fromBytes(toBytes((short)123), short.class));
            System.out.println(Arrays.toString(toBytes(123.0D))     + " ===> " + fromBytes(toBytes(123.0D), double.class));
            System.out.println(Arrays.toString(toBytes(123.0F))     + " ===> " + fromBytes(toBytes(123.0F), float.class));
        }
     
        static <T extends Number> byte[] toBytes(T num) {
            if (num instanceof Integer) {
                return ByteBuffer.allocate(inBytes(Integer.SIZE)).putInt(((Integer)num).intValue()).array();
            }else if (num instanceof Short) {
                return ByteBuffer.allocate(inBytes(Short.SIZE)).putShort(((Short)num).shortValue()).array();
            }else if (num instanceof Long) {
                return ByteBuffer.allocate(inBytes(Long.SIZE)).putLong(((Long)num).longValue()).array();
            }else if (num instanceof Double) {
                return ByteBuffer.allocate(inBytes(Double.SIZE)).putDouble(((Double)num).doubleValue()).array();
            }else if (num instanceof Float) {
                return ByteBuffer.allocate(inBytes(Float.SIZE)).putFloat(((Float)num).floatValue()).array();
            }else if(num instanceof Byte){
                return ByteBuffer.allocate(inBytes(Byte.SIZE)).put(((Byte)num).byteValue()).array();
            }else{
                throw new IllegalArgumentException(num +" not supported");
            }
        }
     
        private static int inBytes(int bits) {
            return bits/Byte.SIZE;
        }
        
        @SuppressWarnings("unchecked")
        static <T extends Number> T fromBytes(byte[] bytes, Class<T> numType){
            ByteBuffer buffer = ByteBuffer.wrap(bytes);
            if(Integer.class.equals(numType) || int.class.equals(numType)){
                return (T)Integer.valueOf(buffer.asIntBuffer().get());
            }else if(Short.class.equals(numType) || short.class.equals(numType)){
                return (T)Short.valueOf(buffer.asShortBuffer().get());
            }else if(Long.class.equals(numType) || long.class.equals(numType)){
                return (T)Long.valueOf(buffer.asLongBuffer().get());
            }else if(Double.class.equals(numType) || double.class.equals(numType)){
                return (T)Double.valueOf(buffer.asDoubleBuffer().get());
            }else if(Float.class.equals(numType) || float.class.equals(numType)){
                return (T)Float.valueOf(buffer.asFloatBuffer().get());
            }else if(Byte.class.equals(numType) || byte.class.equals(numType)){
                return (T)Byte.valueOf(buffer.get());
            }else{
                throw new IllegalArgumentException(numType +" not supported");
            }
        }
     
    }

    Ausgabe:
    Code :
    1
    2
    3
    4
    5
    6
    
    [0, 0, 0, 123] ===> 123
    [0, 0, 0, 0, 0, 0, 0, 123] ===> 123
    [123] ===> 123
    [0, 123] ===> 123
    [64, 94, -64, 0, 0, 0, 0, 0] ===> 123.0
    [66, -10, 0, 0] ===> 123.0

    Gruß Tom
    Ryu1991 bedankt sich. 
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  7. #7
    Avatar von Ryu1991
    Ryu1991 Ryu1991 ist offline Mitglied Gold
    Registriert seit
    Dec 2007
    Beiträge
    241
    Oha,
    ich ziehe meinen Hut.
    Vielen Dank, das ist Perfekt
     
    "2 Dinge sind Unendlich, die Menschliche Dummheit und das Universum, bei 2tem bin ich mir noch nicht ganz sicher", Albert Einstein
    "Wenn man keine Ahnung hat, einfach mal Fresse halten", Dieter Nuhr

Ähnliche Themen

  1. Alle Subklassen eines Typs ermitteln
    Von dondope im Forum Algorithmen & Datenstrukturen mit Java
    Antworten: 9
    Letzter Beitrag: 13.08.11, 21:08
  2. Antworten: 16
    Letzter Beitrag: 11.07.10, 14:09
  3. [vb.net] GetProperties eines Typs ohne Instanz
    Von Klein0r im Forum .NET Café
    Antworten: 12
    Letzter Beitrag: 11.03.09, 14:21
  4. alle dateien eines typs einlesen
    Von UrsaMajor im Forum Borland CBuilder und VCL
    Antworten: 7
    Letzter Beitrag: 24.04.05, 16:19
  5. Member eines bestimmten Typs mit Reflection finden
    Von jccTeq im Forum .NET Archiv
    Antworten: 2
    Letzter Beitrag: 12.01.05, 09:19