Sziasztok,
az lenne a problémám hogy nem tudok long típusú változót byte tömbé majd vissza konvertálni long típusra. Az interneten talált megoldások közül sajna egyik sem működött. Ha valaki tud egy működő megoldást kérem írja be ide a fórumba.
Előre is köszönöm.
- 2636 megtekintés
Hozzászólások
tologatos bitmaskolos
long ize;
byte cucc[8];
cucc[0]=ize&0xFF;
cucc[1]=(ize>>8)&0xFF;
cucc[2]=(ize>>16)&0xFF;
cucc[3]=(ize>>24)&0xFF;
..
ize=cucc[0]+cucc[1]<<8+cucc[2]<<16+cucc[3]<<24 ..;
ilyesmi erdekel?
& nem is kell..
- A hozzászóláshoz be kell jelentkezni
Ezzel csak az a baj, hogy a long 8 byte-os.
- A hozzászóláshoz be kell jelentkezni
Szerkesztettem ,es oda tettem .. ot :)
De szerintem, most nem az a lenyeg.
- A hozzászóláshoz be kell jelentkezni
OK, láttam, hogy Te is észrevetted gysorsan, mire postoltam, már javítva volt.
- A hozzászóláshoz be kell jelentkezni
aha frankó köszi.
- A hozzászóláshoz be kell jelentkezni
az első része műkszik, a második viszont nem, nem ugyan azt az int-et (vagy long-ot) kapom vissza mint ai eredetileg volt. A byte tömbe még az eredeti int szerepel.
- A hozzászóláshoz be kell jelentkezni
Persze, hogy nem. A byte ugyanis signed a java-ban.
Nagyon elbaszott feature, es nem is sietnek javitani :(
- A hozzászóláshoz be kell jelentkezni
Igen számomra is értehtetlen hogy minek eröltetik ezt a "nem kell unsigned" dolgot.
- A hozzászóláshoz be kell jelentkezni
byte cucc[] = new byte[8];
byte a;
for (a=0;a<8;a++)
{
cucc[a]=(byte) (ize>>(a<<3));
}
//Hol a define ? :)
ize=0;
for (a=0;a<8;a++)
ize+=((long) ( cucc[a]>=0?cucc[a]:(cucc[a]+256)))<<(a<<3);
System.out.println((long)ize);
/me haza ertem
- A hozzászóláshoz be kell jelentkezni
Esetleg:
long longVar;
...
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
dos.writeLong(longVar);
byte[] longVarAsByteArray = bos.toByteArray();
- A hozzászóláshoz be kell jelentkezni
Overhead ?
- A hozzászóláshoz be kell jelentkezni
Azt nem írtam, hogy jobb mint a Tied, csak lehet így is.
"Csak" 8x lassabb 8-)
- A hozzászóláshoz be kell jelentkezni
Csakazértismégegymegoldás!
*Szerintem a legszebb, legköltségesebb, legszabványosabb :)*
BigInteger.toByteArray()
- A hozzászóláshoz be kell jelentkezni
Na ez az a pont, ahol mar aszondanam, hogy JNI + C. Ott egyszeruen definialnal egy byte-pointert a tombre, es joccakat.
T'om, byte order meg minden, de meg azzal egyutt is 1000x szebb, egyszerubb es gyorsabb...
- A hozzászóláshoz be kell jelentkezni
Itt a megoldás, ez tökéletesen működik:
final long integer = 2345968;
byte[] byteArray = null;
//ez a számból byte tömböt csinál
ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
dos.writeLong(integer);
dos.flush();
byteArray = bos.toByteArray();
// ez meg a byte tömbből vissza csinálja a számot
ByteArrayInputStream bis = new ByteArrayInputStream(byteArray);
DataInputStream in = new DataInputStream(bis);
System.out.println(in.readLong());
- A hozzászóláshoz be kell jelentkezni
Jaham. Csak kozben odakonvertalaskor 3, visszakonvertalaskor 2 objektumot peldanyositottal. Nem is szolva arrol, hogy csak azert, mert valami a javalib-ben van, meg nem feltetlen korrektul van am megirva. Erdemes neha megnezni, mi is tortenik a hatterben, mert neha eleg letaglozo tud am lenni...
- A hozzászóláshoz be kell jelentkezni
java.io.Bits osztalyban meg van irva, onnan ki lehet masolni.
De eleg specialis kell legyen az alkalmazas, ami indokolja.
Sima objektum atvitelhez pl. tokeletes lehet az ObjectOutputStream.
- A hozzászóláshoz be kell jelentkezni
Tele lett a tököm ezzel, és újraírtam az egészet úgy hogy ne byte tömbökben hanem, streamek segítségével cseréljenek adatokat az objektumok. De ez sem működi. Ami az egyik objektumnak input az a másiknak output. És egyszerűen nem tudok összekapcsoli egy bemenetei és egy kimeneti streamet. A Piped streamal az a baj, hogy a pipedInputStream elejére nem tudok DataInputStreamet kötni csak PipedStreamot lehet.
Létezik ebben a nyelvben valami megoldás arra hogy az objektumok adatokat tudjanak cserélni normálisan????
Azt hogy a ByteArrayOutputStream toArray() methódusát hazsnáljam nem nyer mert az egyik objetum egy fileből olvas mondjuk 100mb-t és azt akrja a másik objektum egy másik fájlba kiírni.
- A hozzászóláshoz be kell jelentkezni
"Létezik ebben a nyelvben valami megoldás arra hogy az objektumok adatokat tudjanak cserélni normálisan????"
1. Nem tisza OO nyelv.
2. Ugy beszelsz mintha szalak vagy processekrol lenne szo.
- A hozzászóláshoz be kell jelentkezni
Most csak fejből, nem teszteltem, de így valahogy:
PipedInputStream in = new PipedInputStream(new DataOutputStream());
PipedInputStream in = new PipedInputStream(new [akármilyen]OutputStream());
Vagy igaziból ide kéne a másik object out-ja: (vagy nem jól értem?)
PipedInputStream in = new PipedInputStream(masikObject.out);
Ennek meni kéne, És ugyanez visszafele :
PipedOutputStream out = new PipedOutputStream(new DataInputStream());
avagy:
PipedOutputStream out = new PipedOutputStream(masikObject.in);
Row
- A hozzászóláshoz be kell jelentkezni
"Létezik ebben a nyelvben valami megoldás arra hogy az objektumok adatokat tudjanak cserélni normálisan????"
Persze. Pl. az adatokat berakod egy objektumba, majd az objektumra mutató referenciát átpasszolod a célnak egy metódushívással. Tulajdonképpen miért is akarsz te byte tömbökkel kommunkálni?
- A hozzászóláshoz be kell jelentkezni