[C++] Casten van byte array naar short array

Pagina: 1
Acties:

  • jaapstobbe
  • Registratie: September 2002
  • Laatst online: 07:19
Hallo,
ik heb met onderstaande code een binary file ingelezen, naar een array van bytes (chars). Ik wil deze array graag omzetten naar een array van signed shorts. De binary file bestaat uit signed shorts op "little-endian" volgorde. De binary file heb ik als volgt ingelezen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  ifstream::pos_type size;
  char * memblock;
 
  ifstream file ("Z:\\test.txt", ios::in|ios::binary|ios::ate);
  if (file.is_open())
  {
    size = file.tellg();
    memblock = new char [size];
    file.seekg (0, ios::beg);
    file.read (memblock, size);
    file.close();

    cout << "the complete file content is in memory";

    delete[] memblock;
  }
  else cout << "Unable to open file";


wat ik in principe wil doen, als dat mogelijk is, een short pointer maken om de array te lezen en om te zetten naar een nieuwe die bestaat uit shorts.

[ Voor 9% gewijzigd door jaapstobbe op 12-10-2006 10:02 ]


  • BalusC
  • Registratie: Oktober 2000
  • Niet online

BalusC

Carpe diem

Ik weet niet hoe het zit in C++, maar in Java is er een groot verschil tussen bytes en chars. Je kunt een tekstbestand beter inlezen naar een char array. Deze bevat leesbare tekens en zo ook leesbare shorts, dan zie ik niet in waarom een conversie van char[] naar short[] nuttig zou zijn.

  • jaapstobbe
  • Registratie: September 2002
  • Laatst online: 07:19
BalusC schreef op donderdag 12 oktober 2006 @ 10:03:
Ik weet niet hoe het zit in C++, maar in Java is er een groot verschil tussen bytes en chars. Je kunt een tekstbestand beter inlezen naar een char array. Deze bevat leesbare tekens en zo ook leesbare shorts, dan zie ik niet in waarom een conversie van char[] naar short[] nuttig zou zijn.
ok als chars inladen kan ook. maar hoe dan verder?

  • moto-moi
  • Registratie: Juli 2001
  • Laatst online: 09-06-2011

moto-moi

Ja, ik haat jou ook :w

BalusC schreef op donderdag 12 oktober 2006 @ 10:03:
Ik weet niet hoe het zit in C++, maar in Java is er een groot verschil tussen bytes en chars. Je kunt een tekstbestand beter inlezen naar een char array.
Hij leest een binair bestand in ;)
Deze bevat leesbare tekens en zo ook leesbare shorts, dan zie ik niet in waarom een conversie van char[] naar short[] nuttig zou zijn.
Nouja, nuttig..nuttig :P

Het kan in ieder geval wel:
C++:
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>

int main()
{
    char a = 'a';
    
    std::cout << "Char a == " << a << ", short a == " << (short)a << std::endl;
    
    
    return 0;
}

Ik denk alleen dat pointers niet zo goed gaan, want een short is 2 bytes terwijl een char er maar eentje is:

C++:
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>

int main()
{
    char a = 'a';
    short b = 50;
    std::cout << "size a == " << sizeof(a) << ", double b == " << sizeof(b) << std::endl;
    
    
    return 0;
}

[hylke@kahlan tmp]$ ./blaat 
size a == 1, double b == 2

God, root, what is difference? | Talga Vassternich | IBM zuigt


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  ifstream::pos_type size;
  short* memblock;
 
  ifstream file ("Z:\\test.txt", ios::in|ios::binary|ios::ate);
  if (file.is_open())
  {
    size = file.tellg();
    memblock = new short [size/sizeof(short)];
    file.seekg (0, ios::beg);
    file.read ((char*)memblock, size);
    file.close();

    cout << "the complete file content is in memory";

    delete[] memblock;
  }
  else cout << "Unable to open file";

Kan je het niet gewoon zo doen? Je maakt dus een buffer van shorts. Alleen aangezien je read functie een char* verwacht cast je die daarnaar toe. Het haalt voor de Read functie natuurlijk niet uit hoe jij dat stukje geheugen later gebruikt. Hij leest ze ernaar toe als chars. Maar jij gebruikt ze later gewoon als shorts.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 09:08

.oisyn

Moderator Devschuur®

Demotivational Speaker

rwb heeft het bij het rechte eind, zolang je zeker weet dat de endianness van de host en de file gelijk is. Een std::vector<short> was handiger geweest though, want wat als file.read() een exception gooit? :)

Wat BalusC zegt klopt wel mbt Java, maar C++ en Java zijn niet hetzelfde ;)

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.


  • jaapstobbe
  • Registratie: September 2002
  • Laatst online: 07:19
rwb schreef op donderdag 12 oktober 2006 @ 10:20:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  ifstream::pos_type size;
  short* memblock;
 
  ifstream file ("Z:\\test.txt", ios::in|ios::binary|ios::ate);
  if (file.is_open())
  {
    size = file.tellg();
    memblock = new short [size/sizeof(short)];
    file.seekg (0, ios::beg);
    file.read ((char*)memblock, size);
    file.close();

    cout << "the complete file content is in memory";

    delete[] memblock;
  }
  else cout << "Unable to open file";

Kan je het niet gewoon zo doen? Je maakt dus een buffer van shorts. Alleen aangezien je read functie een char* verwacht cast je die daarnaar toe. Het haalt voor de Read functie natuurlijk niet uit hoe jij dat stukje geheugen later gebruikt. Hij leest ze ernaar toe als chars. Maar jij gebruikt ze later gewoon als shorts.
goed, en hoe lees ik de shorts nu uit het geheugen? of is er ene manier om ze meteen in een aparte array te zetten...

  • jaapstobbe
  • Registratie: September 2002
  • Laatst online: 07:19
.oisyn schreef op donderdag 12 oktober 2006 @ 10:59:
rwb heeft het bij het rechte eind, zolang je zeker weet dat de endianness van de host en de file gelijk is. Een std::vector<short> was handiger geweest though, want wat als file.read() een exception gooit? :)

Wat BalusC zegt klopt wel mbt Java, maar C++ en Java zijn niet hetzelfde ;)
hoe draai ik de endianness om, als dat nodig is?

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
je hebt dan toch gewoon een pointer naar een buffer van shorts? Die kan je dan toch gewoon normaal gebruiken?
C++:
1
short firstShort = memblock[0];

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 09:08

.oisyn

Moderator Devschuur®

Demotivational Speaker

jaapstobbe schreef op donderdag 12 oktober 2006 @ 11:22:
hoe draai ik de endianness om, als dat nodig is?
Door per short de twee bytes om te wisselen, wat dacht je dan? :)

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.


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 09:03
jaapstobbe schreef op donderdag 12 oktober 2006 @ 11:22:
hoe draai ik de endianness om, als dat nodig is?
swab() of swap() dat vergeet ik altijd

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 09:08

.oisyn

Moderator Devschuur®

Demotivational Speaker

swab, maar da's geen ISO C(++)

[ Voor 7% gewijzigd door .oisyn op 12-10-2006 18:49 ]

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.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 10-12-2025
2 byte shorts zijn ook geen ISO C++; je bent sowieso implementatie-specifiek bezig.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 09:08

.oisyn

Moderator Devschuur®

Demotivational Speaker

Mijn punt was dat die functie weleens helemaal niet op zijn platform beschikbaar kon zijn. Hij heeft immers nog niet gemeld welke implementatie hij gebruikt. Mijn opmerking had niets met platformonafhankelijkheid te maken.

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.


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
swab lijkt me nou niet zo'n ingewikkelde functie dat je die niet even zelf in een minuut in kan typen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 09:03
Nee das waar maar als tie aanwezig is gebruik ik em wel. Zoals MSalters al zegt als je dat ding nodig hebt ben je zowieso platform specifiek bezig en als hij aanwezig is vindt ik het onzin om em zelf te schrijven.
rwb schreef op vrijdag 13 oktober 2006 @ 08:23:
swab lijkt me nou niet zo'n ingewikkelde functie dat je die niet even zelf in een minuut in kan typen.
Da's waar maar het is een goede oefening om mijn 'not invented here' syndroom te bestrijden :)

[ Voor 39% gewijzigd door farlane op 13-10-2006 09:08 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 09:08

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ok, let me rephrase:

Met swab kan het idd, maar wellicht bestaat die functie bij jou niet.

Zo dan? ;)

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