[JAVA] van een char array naar een int

Pagina: 1
Acties:

  • Tim_bots
  • Registratie: April 2004
  • Laatst online: 13-04 13:39
Hallo,

Ik ben bezig net een programma om .ns1 (netstumbler) files om te zetten naar data voor bijvoorbeeld microsoft autoroute en dergelijke. Ik loop alleen een beetje vast bij het importeren van de .ns1 file.
In de spec's staat vermeld (zie http://www.stumbler.net/ns1files.html) dat de MaxSignal een int32 is.
Ik gebruik nu devolgende code voor het uitlezen:
Java:
1
2
char[][] MaxSignal = new char[toInt(apInfo)][4];
in.read(MaxSignal[index],0,4);
mijn char array bevat dus nu (in hex)[[AE, FF, FF, FF],.....]
omgezet moet dit een waarde van -82 zijn.

Ik gebruik nu een vage code voor de omzetting maar die heeft geen zin in dit geval want die werkt voor geen meter.

Ik hoop dat 1 van jullie de juiste code voor deze omzetting weet.

offtopic in dit geval ik zoek ook nog code voor de FILETIME (zie beschrijving boven de gegevenstabel)

Alvast hartelijk bedankt voor al jullie hulp en reacties, Tim Bots


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 23-04 22:57

Janoz

Moderator Devschuur®

!litemod

AEFFFFFF is inderdaad ook -82 in signed little (of was het nu big) endian. bedenk dat negatieve waarden beginnen te tellen vanaf FF FF FF FF. Dat is dan gelijk aan -1. FF FF FF FE = -2 enz enz.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:35

.oisyn

Moderator Devschuur®

Demotivational Speaker

AEFFFFFF voor -82 is little endian. De eerste byte gaat dus in de onderste 8 bits van de int, de tweede in de volgende 8, etc. Het is met wat simpel bitshiften makkelijk te implementeren

[ Voor 20% gewijzigd door .oisyn op 04-11-2005 16:30 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Tim_bots
  • Registratie: April 2004
  • Laatst online: 13-04 13:39
Ik heb wat lopen proberen en naar wat oude code lopen kijken (waar ik het via het binaire stelsel heb gedaan (helaas vb en met een int8)) en ik kom uit op dit:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private static int toInt(char[] input){
    String binary = new String(); 
    for(int a = 0; a<input.length;a++){
        binary +=Integer.toBinaryString((int)input[a]);
    }
    int converted = 0;
    for(int a = 0;a<binary.length();a++){
        String temp = binary.substring(a,a+1);
        if (temp.equals("1")){
            converted += 2^a;
        }
    }
    
    return converted;
}
Hierna is converted: 487 en binair: 10101110111111111111111111111111

Het is nog niet de goede code maar al een heel stuk op weg (ik hoop maar mag het eigenlijk niet vragen) dat iemand deze code voor me af wil maken.

Alvast hartelijk bedankt voor al jullie hulp en reacties, Tim Bots


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:35

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wat dacht je van:
Java:
1
2
3
4
5
6
7
8
int toInt(char[] input)
{
    return
        (int)input[0] |
        ((int)input[1] << 8) |
        ((int)input[2] << 16) |
        ((int)input[3] << 24);
}

[ Voor 10% gewijzigd door .oisyn op 04-11-2005 17:20 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Je kan je stream natuurlijk ook in een DataInputStream wrappen en de readInt-functie gebruiken ;)
Sowieso hoor je voor binary data de byte streams (*Stream) te gebruiken, ipv de character streams (*Reader/Writer).

[ Voor 38% gewijzigd door ACM op 04-11-2005 18:49 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:35

.oisyn

Moderator Devschuur®

Demotivational Speaker

ACM: kun je endianness opgeven bij die data streams? Java is namelijk big-endian, zijn fileformaat is little-endian :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 23-04 22:57

Janoz

Moderator Devschuur®

!litemod

Daarnaast heb je in Java (afaik) geen unsigned ints.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Tim_bots
  • Registratie: April 2004
  • Laatst online: 13-04 13:39
.oisyn, je code werkt. Vraag alleen aan mij niet hoe.

ik heb er zelf ook nog een aanpassing aan gedaan zodat hij ook werkt voor andere lengte's van char[]
Java:
1
2
3
4
5
6
7
    private static int toInt(char[] input){ 
        int value = (int)input[0];  
        for(int a = 1;a<input.length;a++){
            value = value | ((int)input[a]<<(a*8));
        }
        return value;
    }
Ik zal er wel tekening mee houden dat een int niet oneindig groot kan worden.

p.s. als je mij kunt uitleggen hoe de code werkt graag

Alvast hartelijk bedankt voor al jullie hulp en reacties, Tim Bots


  • Daos
  • Registratie: Oktober 2004
  • Niet online
Met de shift (<<) verplaats je de byte naar de juiste plek in een nieuwe integer en met de bitwise-or (|) plak je deze integer bij het resultaat.

Neem bijvoorbeeld:
Java:
1
input = {0x12, 0x34, 0x56, 0x78}


dan is dit de 'berekening':
Java:
1
2
3
4
5
6
(int)input[0]       ==> 0x00000012
(int)input[1] << 8  ==> 0x00003400
(int)input[2] << 16 ==> 0x00560000
(int)input[3] << 24 ==> 0x78000000
                        ---------- | (bitwise-or)
                        0x78563412


Dit had je natuurlijk ook zelf kunnen zien met een debugger.

  • Tim_bots
  • Registratie: April 2004
  • Laatst online: 13-04 13:39
Daos,

Bedankt voor de uitleg. maar helaas laat mijn debugger (eclipse) niet de hex-waarden zien, alleen maar de decimale.

Alvast hartelijk bedankt voor al jullie hulp en reacties, Tim Bots


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:35

.oisyn

Moderator Devschuur®

Demotivational Speaker

Janoz schreef op zaterdag 05 november 2005 @ 01:03:
Daarnaast heb je in Java (afaik) geen unsigned ints.
Die heeft de topicstarter toch ook niet nodig :?

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • ari3
  • Registratie: Augustus 2002
  • Niet online
Tim_bots schreef op zaterdag 05 november 2005 @ 08:36:
.oisyn, je code werkt. Vraag alleen aan mij niet hoe.

ik heb er zelf ook nog een aanpassing aan gedaan zodat hij ook werkt voor andere lengte's van char[]
Java:
1
2
3
4
5
6
7
    private static int toInt(char[] input){ 
        int value = (int)input[0];  
        for(int a = 1;a<input.length;a++){
            value = value | ((int)input[a]<<(a*8));
        }
        return value;
    }
Ik zal er wel tekening mee houden dat een int niet oneindig groot kan worden.
p.s. als je mij kunt uitleggen hoe de code werkt graag
Wil het niet nog ingewikkelder maken, maar houdt er ook rekening mee dat een char in Java altijd 16 bits is. Als je de char[] direct uit een bestand leest en daar toevallig de byte-waarde van een unicode escape tegenkomt komen er dus twee bytes uit de file in één char element.

Je kunt beter het hele idee van een char array loslaten en het op een andere manier inlezen zoals ACM ook al aangaf.

"Kill one man, and you are a murderer. Kill millions of men, and you are a conqueror. Kill them all, and you are a god." -- Jean Rostand


  • Daos
  • Registratie: Oktober 2004
  • Niet online
Je kan ook met bytes werken:
Java:
1
2
3
4
5
6
7
8
int toInt(byte[] input)
{
    return
        ((int)input[0] & 0xff) |
        (((int)input[1] & 0xff) << 8) |
        (((int)input[2] & 0xff) << 16) |
        (((int)input[3] & 0xff) << 24);
}


Die "& 0xff" is nodig omdat de byte signed is. Op deze manier sloop je de sign-extension van de cast er weer af.

[edit]
Tim_bots schreef op zaterdag 05 november 2005 @ 16:42:
Daos,

Bedankt voor de uitleg. maar helaas laat mijn debugger (eclipse) niet de hex-waarden zien, alleen maar de decimale.
Hex-waarden krijg ik in mijn debugger (oude versie van JBuilder) door met de rechtermuisknop te klikken op zo'n decimaal getal en dan vervolgens "Show hex value" te kiezen.
Zoiets zal ook wel bij jou zitten. Aan decimale getallen heb je namelijk niets als je iets met bitjes gaat doen (~, ^, & en |).

[ Voor 47% gewijzigd door Daos op 06-11-2005 19:51 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 23-04 22:57

Janoz

Moderator Devschuur®

!litemod

.oisyn schreef op zaterdag 05 november 2005 @ 18:12:
[...]

Die heeft de topicstarter toch ook niet nodig :?
Als je de door de TS gegeven link volgt zie je dat er meerdere uints in het bestand zitten ;).

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Tim_bots
  • Registratie: April 2004
  • Laatst online: 13-04 13:39
ari3, Ik ben bang dat het niet op de manier van ACM gaar werken
.oisyn schreef op vrijdag 04 november 2005 @ 19:06:
ACM: kun je endianness opgeven bij die data streams? Java is namelijk big-endian, zijn fileformaat is little-endian :)
Ik heb de code nu werkend voor zowel de int als de long variabele die ik moet inlezen. Ik heb nog wel wat problemen met de double (het importeren hiervan)

Verder heb ik officieel wel unsigned int's nodig maar ik heb geen verschil kunnen vinden met de signed int's en ik verwacht hier niet zoveel problemen mee.

Alvast hartelijk bedankt voor al jullie hulp en reacties, Tim Bots


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 23-04 22:57

Janoz

Moderator Devschuur®

!litemod

zolang die unsigned ints niet boven de 2.147.483.647 uitkomt zul je er inderdaad niks van merken, echter staan ze waarschijnlijk niet voor niks als unsigned int.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:35

.oisyn

Moderator Devschuur®

Demotivational Speaker

Wat flags betreft maakt het natuurlijk niets uit, en als je per se het unsigned int bereik aan wilt kunnen spreken dan kun je ze ook casten naar een long en dan and'en met 0xFFFFFFFF

[ Voor 5% gewijzigd door .oisyn op 07-11-2005 15:35 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1