2Danke
ERLEDIGT
JA
JA
ANTWORTEN
6
6
ZUGRIFFE
333
333
EMPFEHLEN
-
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
-
25.01.12 12:31 #2
Hi,
du kannst z.B. mit Number arbeiten.
Oder du übergibst ein ? number und suchst dir dann den richtigen Typen mit if-Bedingung raus.
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.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; }
Gruß
FabioBitte 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.
-
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
-
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.
-
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:
Aber jetzt funktioniert der Modulo-Operator nicht bei bei Number.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)); } } }
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
-
25.01.12 21:55 #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ß TomJava 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
-
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
-
Alle Subklassen eines Typs ermitteln
Von dondope im Forum Algorithmen & Datenstrukturen mit JavaAntworten: 9Letzter Beitrag: 13.08.11, 21:08 -
Konkreten Typ eines generischen Parameters einer Klasse ermitteln?
Von DarthShader im Forum JavaAntworten: 16Letzter Beitrag: 11.07.10, 14:09 -
[vb.net] GetProperties eines Typs ohne Instanz
Von Klein0r im Forum .NET CaféAntworten: 12Letzter Beitrag: 11.03.09, 14:21 -
alle dateien eines typs einlesen
Von UrsaMajor im Forum Borland CBuilder und VCLAntworten: 7Letzter Beitrag: 24.04.05, 16:19 -
Member eines bestimmten Typs mit Reflection finden
Von jccTeq im Forum .NET ArchivAntworten: 2Letzter Beitrag: 12.01.05, 09:19





Zitieren

Login





