Avatar billede mummikiks Nybegynder
12. december 2005 - 12:30 Der er 24 kommentarer og
1 løsning

Konverting af tid til byteArray

Hej Expeter

Jeg bruger følgende linjer til at hente "current time" ud af operativsystemet i java.

Calendar now = Calendar.getInstance();
int year = now.get(Calendar.YEAR)
int month = now.get(Calendar.MONTH);
int day = now.get(Calendar.DAY_OF_MONTH);
int hour = now.get(Calendar.HOUR_OF_DAY);
int minute = now.get(Calendar.MINUTE);

Jeg skal så have konverteret disse til et bytearray, som skal sendes til en microcontroller. Jeg bliver nød til at optimere det lidt,så jeg ønsker et bytearray som er 16 bit, alstå 2 int på microprocessoren. Bytearrayet skal arrangeres på følgende måde.

time : 11 bit som er repræsntere antallet af minutter. altså hour * 60 + minute

weekday  : 3 bit ugedag imellem 1 og 7
dayofyear : 9 bit
year      : 7 bit
fillbit  : 2 bit

Håber der er nogle der kan smide det ned i et bytearray.
Avatar billede arne_v Ekspert
12. december 2005 - 13:00 #1
int v = (year << 2) | (dayofyear  << 9) | (weekday << 18) | (time << 21);
b[0] = (byte)(v & 0xFF);
b[1] = (byte)((v >> 8) & 0xFF);
b[1] = (byte)((v >> 16) & 0xFF);
b[1] = (byte)((v >> 24) & 0xFF);

ret byte og bit order som duhar behov for
Avatar billede mummikiks Nybegynder
12. december 2005 - 14:59 #2
Hej Arne

Jeg har lavet følgende:
Calendar now = Calendar.getInstance();
                              int year = now.get(Calendar.YEAR);
                              int dayofyear = now.get(Calendar.DAY_OF_YEAR);
                              int dayofweek = now.get(Calendar.DAY_OF_WEEK);
                              int hours = now.get(Calendar.HOUR_OF_DAY) * 60 + now.get(Calendar.MINUTE);
        byte[] time = new byte[2];
        int v = (year << 2) | (dayofyear  << 9) | (dayofweek << 18) | (hours << 21);
        time[0] = (byte)(v & 0xFF);
        time[1] = (byte)((v >> 8) & 0xFF);
        time[1] = (byte)((v >> 16) & 0xFF);
        time[1] = (byte)((v >> 24) & 0xFF);
        System.out.println(time[0]);
        System.out.println(time[1]);
        return time;

Jeg får følgende ud: 84,112

Klokken er 14:58

Hvordan kan jeg udregne dagens værdier udfra ovenstående?

Puha du må godtnok drømme om bits....Imponeret
Avatar billede arne_v Ekspert
12. december 2005 - 15:08 #3
hov

        byte[] time = new byte[4];
        int v = (year << 2) | (dayofyear  << 9) | (dayofweek << 18) | (hours << 21);
        time[0] = (byte)(v & 0xFF);
        time[1] = (byte)((v >> 8) & 0xFF);
        time[2] = (byte)((v >> 16) & 0xFF);
        time[3] = (byte)((v >> 24) & 0xFF);
Avatar billede arne_v Ekspert
12. december 2005 - 15:18 #4
og jeg forstår ikke helt det sidste
Avatar billede mummikiks Nybegynder
12. december 2005 - 15:27 #5
Hej Arne...problemet ligger i at jeg skal smide bytearrayet over på en microcontroller hvor en int kun fylder 2 bytes...Er dette muligt? altså således at vio kommer ned på de 16 bit...Som jeg beskrev i mit spørgsmål
Avatar billede arne_v Ekspert
12. december 2005 - 15:34 #6
du kan ikke gemme 32 bit i 16 bit

du kan sende 2 x 16 bit

eller du må nøjes med 16 bit
Avatar billede mummikiks Nybegynder
12. december 2005 - 16:40 #7
Hej Arne...ved godt jeg er lidt bøvlet, men hvis jeg laver nedenstående kode
Calendar now = Calendar.getInstance();
int year = now.get(Calendar.YEAR);
int dayofyear = now.get(Calendar.DAY_OF_YEAR);
int dayofweek = now.get(Calendar.DAY_OF_WEEK) - 1;
int hours = now.get(Calendar.HOUR_OF_DAY) * 60 + now.getalendar.MINUTE);

Så skal jeg have lavet year om til bare at være repræsenteret som 05

Herefter kan jeg lave følgende struct :-) i java....

typedef struct{
  bit time      : 11  antallet af timer * 60 + antallet af minutter (som udregnet)
  bit weekday  :  3  går fra 1-7
  bit dayofyear :  9  går fra 1-365
  bit year      :  7  går fra 0 til 99
  bit fillout  :  2  To tomme bits
}timeType

Hold fast hvor er jeg bøvlet og ringe til at flytte rundt på bit..håber jeg kan få hjælp
Avatar billede mummikiks Nybegynder
12. december 2005 - 16:45 #8
Hov det havde du jo også i dit sidste eks...det er sgu da en god dag...Tak for hjælpen og læg venligst et svar
Avatar billede arne_v Ekspert
12. december 2005 - 16:46 #9
11 + 3 + 9 + 7 + 2 = 32
Avatar billede mummikiks Nybegynder
12. december 2005 - 17:04 #10
public static byte[] clockCoord(){

        Calendar now = Calendar.getInstance();
                              int year = now.get(Calendar.YEAR) - 2000;
                              int dayofyear = now.get(Calendar.DAY_OF_YEAR);
                              int dayofweek = now.get(Calendar.DAY_OF_WEEK) - 1;
                              int hours = now.get(Calendar.HOUR_OF_DAY) * 60 + now.get(Calendar.MINUTE);
       
                              byte[] time = new byte[4];
                             
        int v = (year << 2) | (dayofyear << 9) | (dayofweek << 18) | (hours << 21);
        time[0] = (byte)(v & 0xFF);
        time[1] = (byte)((v >> 8) & 0xFF);
        time[2] = (byte)((v >> 16) & 0xFF);
        time[3] = (byte)((v >> 24) & 0xFF);
        System.out.println(time[0]);
        System.out.println(time[1]);
        System.out.println(time[2]);
        System.out.println(time[3]);
        return time;
       
    }
Giver følgende output:
20
-76
-26
127

Hvordan oversætter man det til noget man kan bruge. repræsentere 20 året?
Avatar billede arne_v Ekspert
12. december 2005 - 17:53 #11
package december;

import java.util.Calendar;

public class BitFun {
    public static void main(String[] args) {
        Calendar now = Calendar.getInstance();
        int year = now.get(Calendar.YEAR) - 2000;
        int dayofyear = now.get(Calendar.DAY_OF_YEAR);
        int dayofweek = now.get(Calendar.DAY_OF_WEEK) - 1;
        int hours = now.get(Calendar.HOUR_OF_DAY) * 60 + now.get(Calendar.MINUTE);
        System.out.println(year);
        System.out.println(dayofyear);
        System.out.println(dayofweek);
        System.out.println(hours);
        byte[] time = new byte[4];
        int v = (year << 2) | (dayofyear << 9) | (dayofweek << 18) | (hours << 21);
        time[0] = (byte) (v & 0xFF);
        time[1] = (byte) ((v >> 8) & 0xFF);
        time[2] = (byte) ((v >> 16) & 0xFF);
        time[3] = (byte) ((v >> 24) & 0xFF);
        System.out.println(time[0]);
        System.out.println(time[1]);
        System.out.println(time[2]);
        System.out.println(time[3]);
        int v2 = (time[0] & 0xFF) | ((time[1] & 0xFF) << 8) | ((time[2] & 0xFF) << 16) | ((time[3] & 0xFF) << 24);
        int year2 = (v2 >> 2) & 0x7F;
        int dayofyear2 = (v2 >> 9) & 0x01FF;
        int dayofweek2 = (v2 >> 18) & 0x07;
        int hours2 = (v2 >> 21) & 0x07FF;
        System.out.println(year2);
        System.out.println(dayofyear2);
        System.out.println(dayofweek2);
        System.out.println(hours2);
    }
}
Avatar billede mummikiks Nybegynder
12. december 2005 - 19:09 #12
Du er den vildeste bittriller i skoven arne..Smid et svar og du for dine mere en fortjente point...
Avatar billede arne_v Ekspert
12. december 2005 - 19:41 #13
ok
Avatar billede arne_v Ekspert
12. december 2005 - 19:46 #14
vær opmkrsom på at bit og bytes kan vendes anderledes

hvis det er java-java så er det OK

men er det java-C (med en struct) så skal der muligvis vendes noget
(men præcis hvordan er compiler & platform specifik)
Avatar billede mummikiks Nybegynder
13. december 2005 - 15:33 #15
Jeg har lige en lille forspørgsel. Jeg kunne godt tænke mig at bruge den første af de to bits til at angive om det er skudår. Skudåret kan beregnes ved at sige
årstal % 4 = 0{
Så skal den sætte den først bit, således at jeg kan dispatche beskeden på min microcontroller
}
Kan det lade sig gøre at smide sådan en lille bit ind hvis ovenstående er opfyldt
Avatar billede arne_v Ekspert
13. december 2005 - 15:48 #16
2100 er ikke et skudår

:-)

men du kan bare sætte den bit ind ligesom de andre felter
Avatar billede mummikiks Nybegynder
14. december 2005 - 20:51 #17
Jeg tror ikke helt jeg har fattet det endnu:
Avatar billede mummikiks Nybegynder
14. december 2005 - 20:51 #18
public static byte[] clockCoord(){
   
          Calendar now = Calendar.getInstance();
            int year = now.get(Calendar.YEAR) - 2000;
            int dayofyear = now.get(Calendar.DAY_OF_YEAR);
            int dayofweek = now.get(Calendar.DAY_OF_WEEK) - 1;
            int hours = now.get(Calendar.HOUR_OF_DAY) * 60 + now.get(Calendar.MINUTE);
            int leapYear;
            if (year / 4 != 0){
                leapYear = 1;   
            }
            else {
                leapYear = 0;
            }
                 
            byte[] time = new byte[4];
            int v = (leapYear << 1) | (year << 2) | (dayofyear << 9) | (dayofweek << 18) | (hours << 21);
            time[0] = (byte) (v & 0xFF);
            time[1] = (byte) ((v >> 8) & 0xFF);
            time[2] = (byte) ((v >> 16) & 0xFF);
            time[3] = (byte) ((v >> 24) & 0xFF);
           
//            System.out.println(time[0]);
//            System.out.println(time[1]);
//            System.out.println(time[2]);
//            System.out.println(time[3]);
           
            /** Translate time*/           
            int v2 = (time[0] & 0xFF) | ((time[1] & 0xFF) << 8) | ((time[2] & 0xFF) << 16) | ((time[3] & 0xFF) << 24);
            int leapYear2 = (v2 >> 1) & 0x7F;
            int year2 = (v2 >> 2) & 0x7F;
            int dayofyear2 = (v2 >> 9) & 0x01FF;
            int dayofweek2 = (v2 >> 18) & 0x07;
            int hours2 = (v2 >> 21) & 0x07FF;
            System.out.println(leapYear2);
            System.out.println(year2);
            System.out.println(dayofyear2);
            System.out.println(dayofweek2);
            System.out.println(hours2);

    return time;
Avatar billede mummikiks Nybegynder
14. december 2005 - 20:52 #19
Hvordan får jeg det smidt ud? hvorfor ander du med 0x7f etc?
Avatar billede arne_v Ekspert
14. december 2005 - 21:11 #20
du mener

          if (year % 4 != 0){
                leapYear = 1; 
            }
            else {
                leapYear = 0;
            }

ikke ?
Avatar billede arne_v Ekspert
14. december 2005 - 21:11 #21
og

int leapYear2 = (v2 >> 1) & 0x01;
Avatar billede arne_v Ekspert
14. december 2005 - 21:12 #22
0x7f = fylder 7 bit

0x01 = fylder 1 bit
Avatar billede mummikiks Nybegynder
14. december 2005 - 21:45 #23
Arghhh nu forstår jeg
Avatar billede mummikiks Nybegynder
14. december 2005 - 21:46 #24
tak
Avatar billede arne_v Ekspert
14. december 2005 - 21:57 #25
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester