byte-array bitweise auslesen

Status
Nicht offen für weitere Antworten.
S

Schu

Gast
Hi !!

ALso...ich habe schon sämtliche Threads zum Thema byte-array durchgeforstet, aber für mein Problem war leider noch nicht das richtige dabei :(

Es geht um folgendes:

Ich möchte ein byte-array (welches double-Werte enthält) der Länge x bitweise auslesen...d.h. die Zahlenwerte innerhalb dieses arrays können unterschiedlich lang sein, z.b. ist der 1.Zahlenwert in den ersten 7 bits gespeichert, der nächste in den nächsten 9 usw. !!
Deshalb komme ich mit der üblichen Herangehensweise (also immer byte-weise shiften) nicht weiter und suche einen Ansatz für mein Problem !!

Vielleicht kann mit ja jemand einen Denkanstoss geben ?? ???:L

Thanx a lot...Schu !!
 

Bleiglanz

Gesperrter Benutzer
Anonymous hat gesagt.:
Hi !!
Ich möchte ein byte-array (welches double-Werte enthält) der Länge x bitweise auslesen...d.h. die Zahlenwerte innerhalb dieses arrays können unterschiedlich lang sein, z.b. ist der 1.Zahlenwert in den ersten 7 bits gespeichert, der nächste in den nächsten 9 usw. !!
hä?

wie willst du denn die "trennung" erreichen, woher weisst du dass erst 7 bits, dann 9 bits usw. sind?
 
G

Guest

Gast
Also dieses Wissen habe ich....ich habe ein byte-array, in dem semantische Informationen zu den Daten stehen, wie Einheit und auch Datenbreite (in Bits), die die datenwerte für ihre "Darstellung" benötigen...daher weiß ich, wieviel Bits ich gerade für den Datenwert auslesen muss...

Hast du vlt. ne Idee, wie ich das am dümmsten bewerkstellige... :? ???:L

grüße
schu
 
S

Schu

Gast
Uuupps...die obige Antwort war von mir...hatte meinen Namen vergessen anzugeben..sorry !!
 

anfänger

Mitglied
vielleicht helfen dir ja shift-operationen weiter:

Bsp: 0011 << 2 == 1100
0111 >> 3 == 0011

die Verschiebung des Bitmusters funktioniert auch um nur eine Stelle nach rechts bzw links
 

thE_29

Top Contributor
Hier hast du ein Beispiel wie man es auslesen kann:


Code:
byte b[] = new byte[2];
    b[0] = 3;
    b[1] = 8;
    byte tmp_clone[] = b.clone();
    for(int x = 0; x != tmp_clone.length; x++)
    {
      System.out.println((x + 1) + "tes Element aus dem Array::");
      for(int y = 0; y != 8; y++) //  8 stellen hat ein Byte 
      {
        System.out.println("  Bit an der " + (y + 1) + " Stelle (entspricht " + (int)java.lang.Math.pow(2,y)  + ") ist: " + (tmp_clone[x] & 1));
        tmp_clone[x] >>= 1;
      }
      System.out.println(); //Zeilenvorschub
    }

Ausgabe:

1tes Element aus dem Array::

Bit an der 1 Stelle (entspricht 1) ist: 1

Bit an der 2 Stelle (entspricht 2) ist: 1

Bit an der 3 Stelle (entspricht 4) ist: 0

Bit an der 4 Stelle (entspricht 8 ) ist: 0

Bit an der 5 Stelle (entspricht 16) ist: 0

Bit an der 6 Stelle (entspricht 32) ist: 0

Bit an der 7 Stelle (entspricht 64) ist: 0

Bit an der 8 Stelle (entspricht 128) ist: 0



2tes Element aus dem Array::

Bit an der 1 Stelle (entspricht 1) ist: 0

Bit an der 2 Stelle (entspricht 2) ist: 0

Bit an der 3 Stelle (entspricht 4) ist: 0

Bit an der 4 Stelle (entspricht 8 ) ist: 1

Bit an der 5 Stelle (entspricht 16) ist: 0

Bit an der 6 Stelle (entspricht 32) ist: 0

Bit an der 7 Stelle (entspricht 64) ist: 0

Bit an der 8 Stelle (entspricht 128) ist: 0


Logik: wenn man einen Wert mit logisch 1 verknüpft (sprich 1ter bit) und es ergibt 1, dann war es vorher auch 1!

Ergibt es 0, dann war des 0!

Danach wird in jedem loop der Schleife, die Zahl um 1 Stelle (1 bit) nach rechts verschoben, sodaß man alle Stellen durchgeht!

Wenn man weiß wie es geht, isses ziemlich leicht :D

Und in C konnte man sogar bitweise daraufzugreifen, bzw vereinbaren... das war halt manchmal schon ein Vorteil :)
 
S

Schu

Gast
Ja das hatte ich auch gedacht und daraufhin folgenden Code "entwickelt":

Code:
 for (int i=0; i<description.getDescriptorsSize(); i++) {
            
            TableContents content = (TableContents) description.getDescriptors().get(i);
            DataItem item = new DataItem();
            
            item.tableBContent = content;
            item.dataValue = (reservedData[i] << content.dataWidth);
            
            realData.add(item);
                        
         }

die Schleife zählt also von 0 los und holt sich für jeden Durchlauf aus einer ArrayList nen Eintrag, der quasi auf das byte-array reservedData "pointed", wo ich auslesen will...die dataWidth bestimmt dabei, wieviel bits er auslesen soll....da geht's aber schon los...was, wenn die dataWidth >8 (also größer als ein Byte) oder <8 ist....ich müsste mir also (so meine Überlegung), einen globalen Counter basteln, der immer den absoluten Abstand (in Bits) vom ANfang von reservedData beinhaltet (indem ich bei jedem Durchlauf die dataWidth hinzuaddiere)....aber weiß er dann auch, dass die Stelle, die ich ihm anweise, als 2^0=1 zu deuten ist ???

hoffe, es wird ein bissl durchsichtiger :bahnhof:

grüße
Schu
 

Bleiglanz

Gesperrter Benutzer
leg das ganze in ein BitSet ein

dann kannst du später mit

BitSet#get(int fromIndex, int toIndex)

die richtigen Bereiche einfach "abgreifen"
 
G

Gast

Gast
Jo, Danke...war auch grad dabei, mich über dei Geschichte zu belesen (in "Java ist auch nur eine Insel")..aber nu bin ich mir da sicher.... ;)
 
S

Schu

Gast
So...hab mir da jetzt ne Methode gebastelt, die aus nem Byte-Array ein bitset macht...vlt. kann ja mal einer drüberschauen (Bleiglanz ?? :wink: )...die ANzahl der Bits stimmt..nur bei den WErten bin ich eher skeptisch, da ich Sie nicht mit REferenzwerten, die ich habe übereinstimmen... ???:L

So...hier der Code:
Code:
   public static BitSet toBitArray(byte[] arr){

      int counter = 0;
      BitSet value = new BitSet(arr.length*8);
      byte tmp_clone[] = (byte[]) arr.clone();
      // Schleife über das gesamte Byte-array
      for(int x = 0; x < tmp_clone.length; x++)
      {
        // Schleife über alle 8 Bits innerhalb eines Bytes (im Byte-array)
        for(int y = 0; y < 8; y++) //  8 stellen hat ein Byte
        {

           if ((tmp_clone[x] & 1) == 1) {
              value.set(counter+y);
           }
           else {
              value.clear(counter+y);
           }
          // shift innerhalb des bytes um 1 nach rechts
          tmp_clone[x] >>= 1;
        }
        
        counter += 8;
      }
      return value;
   }

Wäre euch für hilfreiche Kommentare dankbar...

grüße
Schu
 

Bleiglanz

Gesperrter Benutzer
hab mal den loop unrolled, du musst natürlich das höchste bit an die erste stelle setzen, also innen umgekehrt zählen

(wenn den bitset den "hingeschriebenen" 0-1-strom ergeben soll)

Code:
    byte[] b = new byte[]{(byte)255,(byte)0,(byte)15};
        java.util.BitSet bs = new java.util.BitSet(b.length*8);
        for(int i=0;i<b.length;i++){
            bs.set(i*8+0,(b[i]&128)==128);
            bs.set(i*8+1,(b[i]&64)==64);
            bs.set(i*8+2,(b[i]&32)==32);
            bs.set(i*8+3,(b[i]&16)==16);
            bs.set(i*8+4,(b[i]&8)==8);
            bs.set(i*8+5,(b[i]&4)==4);
            bs.set(i*8+6,(b[i]&2)==2);
            bs.set(i*8+7,(b[i]&1)==1);
        }
 
G

Guest

Gast
Hmmmm...die WErte sind zwar jetzt andere, aber immer noch nicht korrekt (bzgl. der Referenzwerte)...vielleicht liegt das aber auch an der Methode, mittels derer ich aus einer bestimmten Anzahl von Bits einen double-WErt bilde ??

Die sieht so aus...vlt. könntest du ja nochmal kurz "debuggen" :oops: :?

Code:
   public static double bitToInteger(BitSet arr, int start, int len) {
      double res = 0;
      
      for (int j=start, k=0; j<len+start;j++, k++) {
         
         if (arr.get(j) == true) {
            res += pow(2,k);
         }
         else {
            
         }
      }
      
      return res;
   }

Sie nimm sich halt aus dem vorher erzeugten und als Parameter übergebenem Bit-Array ein Teil heraus (von start bis start+len)...diesen soll sie jedes mal wie ein neues Bit-Array behandeln, d.h. das erste Bit bedeutet 2^0, das zweite 2^1 (sofern Sie denn gesetzt sind) bis hin zum letzten....habbisch hier auch wieder nen Denkfehler drin (was mich nich wundern würde) ??

Thanx a lot...Schu
 
S

Schu

Gast
obiger Beitrag war wieder mal von mir, wobei ich meinen Namen vergessen habe *sich vorn Kopf haut*
 

Bleiglanz

Gesperrter Benutzer
keine ahnung

wenn du aus

10101010111101010100101010110

was abgreifst, ist doch wahrscheinlich wieder die umgekehrte reihenfolge richtig (hängt eben davon ab wies reingeschrieben wird)

also das erste bit = 2^länge-1 usw.

was solln das mit den doubles?

wie wurden denn doubles zu einer bitfolge verwandelt?
 
S

Schu

Gast
Haaaaaaaaa...Tausend DAnk !! DAs war's..einmal anders herum ausgewertet und es passt !!!

Bis demnächst :)

many, many THANX...Schu
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
krgewb byte-Array, das ein Bild repräsentiert Java Basics - Anfänger-Themen 1
G ImageIcon in Byte-Array ablegen Java Basics - Anfänger-Themen 7
S Byte-Array kann chars speichern? Java Basics - Anfänger-Themen 3
N Datentypen Image zu Byte-Array Java Basics - Anfänger-Themen 4
D Methoden int to byte array und zurück? Java Basics - Anfänger-Themen 5
F Byte Array wachsen lassen Java Basics - Anfänger-Themen 5
F Teil eines Byte Array an eine Methode übergeben Java Basics - Anfänger-Themen 5
M sehr großes Byte Array Java Basics - Anfänger-Themen 3
M Byte Array und Co. Java Basics - Anfänger-Themen 12
F Hexfolge in Byte Array ersetzen Java Basics - Anfänger-Themen 8
H Variablen 32bit Zählwert als Byte-Array Java Basics - Anfänger-Themen 9
M byte Array Mindestlänge Java Basics - Anfänger-Themen 19
D [jni] jbytearray <-> byte array Java Basics - Anfänger-Themen 8
P byte Array aus ImageIcon Java Basics - Anfänger-Themen 10
V Jar-Datei von Byte-Array oder Stream laden? Java Basics - Anfänger-Themen 9
H Datentypen Byte-Array RSA Java Basics - Anfänger-Themen 9
H Datentypen Rechnen mit signed Byte-Array - unsinged byte Java Basics - Anfänger-Themen 3
M Byte Array: Werte größer 127? Java Basics - Anfänger-Themen 11
H Datentypen Byte-Array aus Stream lesen Java Basics - Anfänger-Themen 3
S Unbekannte Daten einlesen, speichern und in einem byte Array speichern Java Basics - Anfänger-Themen 3
S Alle Datentypen in byte Array und zurückwandeln Java Basics - Anfänger-Themen 2
J Byte-Array als Hex-Datei speichern? Java Basics - Anfänger-Themen 9
J String array to byte array Java Basics - Anfänger-Themen 8
G SHA (byte array) per modulo hashen Java Basics - Anfänger-Themen 6
K Byte-Array als Zeichenfolge ausgeben Java Basics - Anfänger-Themen 3
G byte array in integer konvertieren Java Basics - Anfänger-Themen 15
mwildam Byte array oder String Java Basics - Anfänger-Themen 4
P InputStream in Byte-Array speichern Java Basics - Anfänger-Themen 2
U byte array in datei 'dumpen' / speichern Java Basics - Anfänger-Themen 2
G Byte Array inkrementieren Java Basics - Anfänger-Themen 17
H String in Byte Array wandeln Java Basics - Anfänger-Themen 25
H von und in byte array wandeln Java Basics - Anfänger-Themen 8
D Byte-Array zu Hex-String umwandeln Java Basics - Anfänger-Themen 3
G Konvertierung Byte Array Java Basics - Anfänger-Themen 4
tobiasbeil Von Datei byte für byte lesen und in ein Array einfügen. Java Basics - Anfänger-Themen 11
G Byte-Array Infos speichern Java Basics - Anfänger-Themen 14
F char to byte array Java Basics - Anfänger-Themen 8
G Char oder Byte Array mit unbekannter länge erstellen? Java Basics - Anfänger-Themen 1
T XML Parsen und Inhalt in ein Byte Array schreiben Java Basics - Anfänger-Themen 3
C Byte-Array mit Dateiinhalt füllen Java Basics - Anfänger-Themen 7
G 4-stelliges-Byte-Array in Integer umwandeln geht das? Java Basics - Anfänger-Themen 10
C Probleme mit Byte konvertieren nach int Java Basics - Anfänger-Themen 10
T IOStreams read(byte[]b) methode Java Basics - Anfänger-Themen 2
I Dateigröße von einem InputStream oder byte[] bekommen Java Basics - Anfänger-Themen 2
D Best Practice Parameter int vs byte Java Basics - Anfänger-Themen 16
J RSA Verschlüsselung Testen / byte[] in Objekt umwandeln Java Basics - Anfänger-Themen 1
M Datentypen Byte, Float und Boolean Java Basics - Anfänger-Themen 13
F byte, short oder doch int? Java Basics - Anfänger-Themen 6
S Performance von byte[], short[], int[]..? Java Basics - Anfänger-Themen 24
P int zu byte Java Basics - Anfänger-Themen 8
M Java Klasse Byte Java Basics - Anfänger-Themen 10
F Byte Ausgabe plötzlich falsch Java Basics - Anfänger-Themen 0
V String in Byte umwandeln Java Basics - Anfänger-Themen 11
O Input/Output Ein (negatives) Byte über PrintWriter hinausschreiben Java Basics - Anfänger-Themen 3
T byte[] zu String mit Sonderzeichen Java Basics - Anfänger-Themen 2
W Nullpointer bei Objekt Serialisierung mit ArrayList<byte[]> etc. Java Basics - Anfänger-Themen 2
J byte - Ausgabe Java Basics - Anfänger-Themen 2
S byte to float Java Basics - Anfänger-Themen 4
J Byte Folge erkennen Java Basics - Anfänger-Themen 5
T Operatoren Float in byte umwandeln Java Basics - Anfänger-Themen 3
Y File to byte[] and byte[] to sysout Java Basics - Anfänger-Themen 3
P Wann Byte-Stream und wann Character-Stream? Java Basics - Anfänger-Themen 11
P String in byte konvertieren, wie? Java Basics - Anfänger-Themen 4
T Erste Schritte Byte Java Basics - Anfänger-Themen 3
R byte[] zu String und Ausgabe Java Basics - Anfänger-Themen 2
H Variablen short <-> byte[] Java Basics - Anfänger-Themen 15
X Datentypen String in byte[] Java Basics - Anfänger-Themen 29
H Variablen string nach byte Java Basics - Anfänger-Themen 12
B Frage zur Effizienz von read und read(byte[]) Java Basics - Anfänger-Themen 23
R Erste Schritte Rechnenoperationen mit byte, short und char Java Basics - Anfänger-Themen 8
V Datentypen Frage zum Datentyp Byte Java Basics - Anfänger-Themen 11
L Byte[] to String, doch bits sind gespiegelt (MSB/LSB) Java Basics - Anfänger-Themen 3
S Von byte[] nach String zurueck nach byte[]. Arrays sind nicht identisch :( Java Basics - Anfänger-Themen 6
S ArrayList<Byte> in String umwandeln Java Basics - Anfänger-Themen 5
V unsigned byte? Java Basics - Anfänger-Themen 27
U short[] nach byte[] Java Basics - Anfänger-Themen 11
S Datentypen Ändern eines byte[] Arrays Java Basics - Anfänger-Themen 4
B byte-weise Verschlüsselung Java Basics - Anfänger-Themen 6
S Input/Output String in byte umwandeln? Java Basics - Anfänger-Themen 5
F von Byte zu 2 Stellig Hex Java Basics - Anfänger-Themen 3
G byte[] (Base64) korrekt übergeben Java Basics - Anfänger-Themen 4
O 64bit- OS byte, short, int oder long bzw. float oder double? Java Basics - Anfänger-Themen 13
G Binär in Byte speichern Java Basics - Anfänger-Themen 7
T Datentypen byte -Division..mal gehts mit cast mal ohne Java Basics - Anfänger-Themen 5
T Datentypen default ist int, cast zu byte nötig... Java Basics - Anfänger-Themen 2
F Byte nach Zahl umwandeln Java Basics - Anfänger-Themen 11
E Datentypen type cast problem (int, byte,) Java Basics - Anfänger-Themen 5
T Datentypen unsigned byte? Java Basics - Anfänger-Themen 9
G Integar zu Byte Java Basics - Anfänger-Themen 4
P Byte mit 0...255? Java Basics - Anfänger-Themen 5
N Datentypen Fehler beim Umwandeln in byte Java Basics - Anfänger-Themen 3
L Umwandlung int <--> byte Java Basics - Anfänger-Themen 2
L Datentypen 250 und byte? Java Basics - Anfänger-Themen 4
L Datentypen byte[] in String und wieder zurück Java Basics - Anfänger-Themen 3
N Files mit Byte an Socket versenden Java Basics - Anfänger-Themen 2
V Byte -> String -> Byte verlustfrei Java Basics - Anfänger-Themen 12
Hindi93 Byte to Int Java Basics - Anfänger-Themen 4
H Datentypen byte[] to int Java Basics - Anfänger-Themen 9
S hex zu byte Java Basics - Anfänger-Themen 4
S Addition zweier 32 Byte langer ByteArrays Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben