BitSet to binary

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
hi,

ich habe einen BitSet, welches ich in einen stream schreiben möchte. geschwindigkeit ist ist nicht so wichtig, kompression sollte aber maximal sein. standart ist ein bit in einem byte - nicht sehr sinnvoll ;). daher habe ich versucht, die kapazität voll auszunutzen und 8 bits in einen byte zu packen. gibt es denn schon eine klasse die das für mich erledigt?

hab mich selber mal dran probiert - bin noch nicht lang bei java, ergebnis sieht nicht so toll aus...
abgesehen davon, dass das auch einfacher gehen muss, funktioniert das noch nicht ganz. (encodieren und wieder decodieren erhält die werte nicht, sondern einpaar trues werden zu falses)

Code:
	public byte[] encode(BitSet bits) {
		byte bytes[] = new byte[(bits.length() / 8) + 1];
		int step = 0;
		int n = 0;
		int t;
		while(n <= to) {
			t = -128;
			if(bits.get(n++)) t += 128;
			if(bits.get(n++)) t += 64;
			if(bits.get(n++)) t += 32;
			if(bits.get(n++)) t += 16;
			if(bits.get(n++)) t += 8;
			if(bits.get(n++)) t += 4;
			if(bits.get(n++)) t += 2;
			if(bits.get(n++)) t += 1;
			bytes[step++] = (byte) t;
		}
		return bytes;
	}
	
	public BitSet decode(byte[] bytes) {
		BitSet bits = new BitSet(bytes.length*8);

		int t;

		for(int i = 0; i < bytes.length; i++) {
			t = ((int) bytes[i])+128;			
			if(t > 128) bits.set(i*8);
			if(t%128 > 64) bits.set((i*8)+1);
			if(t%64 > 32) bits.set((i*8)+2);
			if(t%32 > 16) bits.set((i*8)+3);
			if(t%16 > 8) bits.set((i*8)+4);
			if(t%8 > 4) bits.set((i*8)+5);
			if(t%4 > 2) bits.set((i*8)+6);
			if(t%2 > 1) bits.set((i*8)+7);
		}
		return bits;
	}

wäre für einpaar tips sehr dankbar :)

cya,

remo
 

messi

Bekanntes Mitglied
Gast hat gesagt.:
wäre für einpaar tips sehr dankbar :)
Du könntest dich z. B. mal mit Bit-Operationen beschäftigen:
Code:
int b = 0;
b |= 1 << 7; // Bit7 wird gesetzt
b &= ~(1 << 7); // Bit7 wird gelöscht

byte[] bytes;
BitSet bits;

for (int i = 0; i < bytes.length; i++) {
  byte b = bytes[i];
  for (int k = 0; k < 8; k++)
    if ((b & (1 << k)) != 0)
      bits.set(i * 8 + k);
}
 
G

Guest

Gast
danke, hat sehr geholfen :)
das funktioniert jetzt:
Code:
	public static byte[] encode(BitSet bits) {
		int length = bits.length() / 8;
		if(length % 8 != 0) length++;
		byte bytes[] = new byte[length];
		
		for (int i = 0; i < length; i++) 
			for (int k = 0; k < 8; k++) 
				if(bits.get(i*8+k)) bytes[i] |= 1 << k;
		return bytes;
	}
	
	public static BitSet decode(byte[] bytes) {
		BitSet bits = new BitSet();
		for (int i = 0; i < bytes.length; i++) {
			  byte b = bytes[i];
			  for (int k = 0; k < 8; k++)
			    if ((b & (1 << k)) != 0) bits.set(i * 8 + k);
		}
		return bits;
	}

womit ich noch nicht ganz zufrieden bin ist
Code:
		int length = bits.length() / 8;
		if(length % 8 != 0) length++;
		byte bytes[] = new byte[length];
kann man das irgendwie eleganter lösen?
 
B

Beni

Gast
Wenn du in einen Stream schreibst, könntest du einen "ZipOutputStream" verwenden, dann werden die Daten gleich nochmal komprimiert :wink:
 

messi

Bekanntes Mitglied
Gast hat gesagt.:
womit ich noch nicht ganz zufrieden bin ist
Code:
		int length = bits.length() / 8;
		if(length % 8 != 0) length++;
		byte bytes[] = new byte[length];
kann man das irgendwie eleganter lösen?
Du musst
Code:
if ((bits.length() & 0xF) != 0)
oder gleich direkt
Code:
int length = (bits.length() + 7) / 8;
verwenden.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben