timestamp i tablica byte

0

Czesc Wszytskim

Czy moze mi ktos podpowiedziec jak ze zmiennej typu timestamp moge otrzymac tablice bytow?

Pozdrawiam

0

najprościej:

timestamp.toString().getBytes() ;
0

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);
    }
}
0
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

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1