Czesc Wszytskim
Czy moze mi ktos podpowiedziec jak ze zmiennej typu timestamp moge otrzymac tablice bytow?
Pozdrawiam
Czesc Wszytskim
Czy moze mi ktos podpowiedziec jak ze zmiennej typu timestamp moge otrzymac tablice bytow?
Pozdrawiam
najprościej:
timestamp.toString().getBytes() ;
Mały przykład zapisania do tablicy oraz otrzymania z powrotem Timestampa.
ObjectOutputStream objOut = null;
Timestamp t = new Timestamp(System.currentTimeMillis());
System.out.println(t);
ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
try {
objOut = new ObjectOutputStream(byteOut);
objOut.writeObject(t);
byte[] b = byteOut.toByteArray();
/************/
ByteArrayInputStream byteIn = new ByteArrayInputStream(b);
ObjectInputStream objIn = new ObjectInputStream(byteIn);
Timestamp t2 = (Timestamp) objIn.readObject();
System.out.println(t2);
} catch (Exception ex) {
Logger.getLogger(StreamTest.class.getName()).log(Level.SEVERE, null, ex);
} finally {
try {
if (objOut != null) objOut.close();
} catch (IOException ex) {
Logger.getLogger(StreamTest.class.getName()).log(Level.WARNING, null, ex);
}
}
public class Test {
public static void main(String[] args) throws Exception {
long timestamp = 0x1100000000000001L;
byte[] bytes = toBytes(timestamp);
for (byte b : bytes) {
System.out.println(b);
}
System.out.println(timestamp + "\n" + toLong(bytes));
}
private static byte[] toBytes(long val) {
byte[] bytes = new byte[8];
for (int i = 0; i < 8; ++i) {
bytes[i] = (byte) val;
val >>>= 8;
}
return bytes;
}
private static long toLong(byte[] bytes) {
long val = 0;
for (int i = 0; i < 8; ++i) {
val <<= 8;
val |= bytes[8 - i - 1];
}
return val;
}
}
zakladam ze timestamp da sie przeksztalcic jakos na long (nie napisales w sumie co to za typ - jesli java.sql.Timestamp to jest sie da), no bo w sumie zwykle to tak wyglada - timestamp to tzw epoch unixowy, czyli zwykly long
zauwaz ze bajty moga byc ujemne poniewaz poszczegolne bajty w longu moga miec np wartosc FF na ktorejtam pozycji, a bajty w javie sa signed, gdzie ostatni skrajny bajt to bajt znaku, czyli FF w bajcie to jest -1, moga zdarzyc sie oczywiscie inne wartosci
jednakze, jak przeksztalcic z powrotem na longa z tych bajtow, to jest ok
pozdrawiam
ups moj blad, druga metoda powinna wygladac tak:
private static long toLong(byte[] bytes) {
long val = 0;
for (int i = 0; i < 8; ++i) {
val <<= 8;
val |= bytes[8 - i - 1] & 0xFF;
}
return val;
}
&0xFF jest po to zeby bajt traktowac jako unsigned, poniewaz to dzialanie niejawnie przekonwertuje bajta na inta, w ktorym bajt ktory ma wartosc ujemna bedzie mial jedna dodatnia wartosc
sorki jeli niejasno pisze ale juz pozni
pozdro