[C++] char* -> char[]

Pagina: 1
Acties:

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-08 14:20
Ik heb dus een char* en wil deze omzetten naar een char[]. Ik wil namelijk bitwise operations toepassen (left shift, right shift, etc.) De vraag is nu hoe zet ik hem om en als het een char[] is kan ik er dan bitwise operations op los laten?

if broken it is, fix it you should


  • KnoppenSpook
  • Registratie: Augustus 2000
  • Laatst online: 04-09-2023
dat kan op een char * toch ook?

char * sBuffer;

//init van sBuffer

*sBuffer <<=1; //waarde keer 2
sBuffer++;
etc

/me weet geen leuke quote voor in zijn signature


  • Rowwan
  • Registratie: November 2000
  • Nu online
Laat maar... Foutje

[ Voor 78% gewijzigd door Rowwan op 06-02-2003 12:44 ]


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-08 14:20
En als je bijvoorbeeld het 2de karakter van een char* wilt hebben dan?

if broken it is, fix it you should


  • Rowwan
  • Registratie: November 2000
  • Nu online
char++;

  • KnoppenSpook
  • Registratie: Augustus 2000
  • Laatst online: 04-09-2023
char * sBuffer is een pointer naar een buffer. en die pointer kan je ophogen zodat ie naar de volgende plek in de buffer wijst

/me weet geen leuke quote voor in zijn signature


Verwijderd

(BITWISE-NOT <integer>) => <integer>
(BITWISE-AND <integer> <integer>) => <integer>
(BITWISE-IOR <integer> <integer>) => <integer>
(BITWISE-XOR <integer> <integer>) => <integer>

Snap je wat ik bedoel?

Verwijderd

elgringo schreef op 06 February 2003 @ 12:30:
En als je bijvoorbeeld het 2de karakter van een char* wilt hebben dan?
Gewoon met blokhaken, dat mag gewoon op pointers hoor!!:
C++:
1
2
char *sBuffer = "abcdefg";
sBuffer[1] <<= 1;

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-08 14:20
Ik heb dus een *buffer van 512 bytes (1 sector) deze wil ik 2x naar rechts schiften (>>0) Nu heb ik:
code:
1
*buffer=*buffer>>2;

Maar dit doet niets. Wat is er fout?

if broken it is, fix it you should


  • KnoppenSpook
  • Registratie: Augustus 2000
  • Laatst online: 04-09-2023
wat doet het niet?
Staat de pointer wel naar de goeie plek te wijzen?

/me weet geen leuke quote voor in zijn signature


Verwijderd

Jij wilt misschien dat de laagste twee bitjes doorschuiven naar het eersvolgende karakter?

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-08 14:20
Uitleg:

Ik ben een sector van de hd aan het lezen (512 byte)

definitie buffer:
C++:
1
char* buffer = (char*)malloc (512*numberofsectors);


lezen van sector (grote=512):
C++:
1
if (!ReadFile (hDevice, buffer, grote, &bytesread, NULL) )


Deze buffer wordt op het scherm gekwakt. Nu wil ik de laatste 2 bytes weg hebben (en de eerste 464, zodat ik alleen de partition entries overhoud)
C++:
1
 *buffer <<= 2;


En dan blijft het resultaat hetzelfde (dus met of zonder shift maakt voor het resultaat nix uit)

if broken it is, fix it you should


Verwijderd

elgringo schreef op 06 februari 2003 @ 13:26:
Uitleg:

Ik ben een sector van de hd aan het lezen (512 byte)

definitie buffer:
C++:
1
char* buffer = (char*)malloc (512*numberofsectors);


lezen van sector (grote=512):
C++:
1
if (!ReadFile (hDevice, buffer, grote, &bytesread, NULL) )


Deze buffer wordt op het scherm gekwakt. Nu wil ik de laatste 2 bytes weg hebben (en de eerste 464, zodat ik alleen de partition entries overhoud)
C++:
1
 *buffer <<= 2;


En dan blijft het resultaat hetzelfde (dus met of zonder shift maakt voor het resultaat nix uit)
Begrijp je wel wat je doet (en wilt)?
Ten eerste veranderen van de pointer buffer laat geen data verdwijnen, wat jij wilt is de pointer buffer verplaatsen naar zn nieuwe plek, dus buffer+=464 en daarna de debetreffende bytes uitlezen.

  • KnoppenSpook
  • Registratie: Augustus 2000
  • Laatst online: 04-09-2023
*buffer <<= 2; verschuift het eerste byte in de buffer 2 BITS!!! naar links. Dus niet 2 BYTES

/me weet geen leuke quote voor in zijn signature


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-08 14:20
Verwijderd schreef op 06 February 2003 @ 13:30:
[...]


Begrijp je wel wat je doet (en wilt)?
Ten eerste veranderen van de pointer buffer laat geen data verdwijnen, wat jij wilt is de pointer buffer verplaatsen naar zn nieuwe plek, dus buffer+=464 en daarna de debetreffende bytes uitlezen.
waarom was de vraag of ik er eerst een char[] van moest maken, maar dit was niet nodig volgens bepaalde iemanden

if broken it is, fix it you should


Verwijderd

elgringo schreef op 06 februari 2003 @ 13:32:
[...]


waarom was de vraag of ik er eerst een char[] van moest maken, maar dit was niet nodig volgens bepaalde iemanden
Of je er een char[] van maakt of je werkt met de buffer pointer, maakt niet zoveel uit, is een implementatie.
Stel je maakt er een char[] van, dan kun je meteen de waardes uitlezen buffer[463], buffer[464], etc.

Bij zoiets is het vaak handig om een tekening te maken van wat je eigenlijk doet.

Verduidelijking voor jou:
char *buffer

*buffer is dan een char en buffer is de verwijzing naar een char.

[ Voor 11% gewijzigd door Verwijderd op 06-02-2003 13:39 . Reden: de r zat er niet in, wel in de maand, nog 2 nachtjes ]


Verwijderd

Waarom zet je "grote" niet gewoon op 510 :? |:(

En da bijvoorbeeld
C++:
1
char* part_entry = &buffer[464];


(Dan wijst de pointer "part_entry" precies naar offset 464, oftewel het 465-ste byte.)

Maar waarom gebruik je in hemelsnaam geen structs, want een partitietabel heeft een voorgedefineerd formaat, dat is toch veel handiger?! Ik weet wel dat ik jou liever niet met mijn HD's laat rommelen...

[ Voor 89% gewijzigd door Verwijderd op 06-02-2003 13:47 ]


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-08 14:20
Verwijderd schreef op 06 februari 2003 @ 13:38:
Waarom zet je "grote" niet gewoon op 510 :? |:(

En da bijvoorbeeld
C++:
1
char* part_entry = &buffer[464];


(Dan wijst de pointer "part_entry" precies naar offset 464, oftewel het 465-ste byte.)

Maar waarom gebruik je in hemelsnaam geen structs, want een partitietabel heeft een voorgedefineerd formaat, dat is toch veel handiger?! Ik weet wel dat ik jou liever niet met mijn HD's laat rommelen...
je kan alleen per 512 lezen

en als ik jouw code gebruik dan begint hij niet met het 465ste byte met lezen maar iets heel anders (wat ik niet terug kan vinden)

[ Voor 14% gewijzigd door elgringo op 06-02-2003 14:16 ]

if broken it is, fix it you should


Verwijderd

elgringo schreef op 06 February 2003 @ 14:13:
[...]


je kan alleen per 512 lezen

en als ik jouw code gebruik dan begint hij niet met het 465ste byte met lezen maar iets heel anders (wat ik niet terug kan vinden)
Als de code goed is, dan zou part_entry moeten verwijzen naar de 465e byte en zou part_entry[0] de 1e byte moeten zijn (vanaf byte 465)

[ Voor 3% gewijzigd door Verwijderd op 06-02-2003 14:22 ]


Verwijderd

Volgens mij wil jij vanaf byte 446 (0x1BE) lezen, daar staat namelijk de eerste primaire partitieverwijzing, dus niet op byte 465...

Misschien dat je iets hebt aan dit door mij in elkaar geflantste stuk code:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
typedef struct __attribute__((packed)) {
    char state;
    char first_head;
    short first_cylsect;
    char type;
    char end_head;
    short end_cylsect;
    long sector_offset;
    long total_sectors;
} PART_ENTRY;

typedef struct __attribute__((packed)) {
    char bootloader[446];
    PART_ENTRY partitions[4];
    char signature[2];
} MBR_RECORD;

int main ()
{
    MBR_RECORD record;

    /* Assertions validity: */
    assert(sizeof(PART_ENTRY) == 16);
    assert(sizeof(record) == 512);

    /* Lets read the MBR record: */
    if (!ReadFile (hDevice, &record, sizeof(record), &bytesread, NULL) )
    /* etc... */

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 23:08
Ik denk dat je je nog eens goed achter de oren moet krabben, als je met partition tables en master boot records gaat spelen, maar geen idee hebt wat een array in C/C++ is (of wat voor operaties je er op kunt toepassen). Maar goed, laat mij je lol niet verpesten. Ik kan je echter wel aanraden om niets terug te schrijven tot je een heel goed idee hebt waar je mee bezig bent. :P

  • beany
  • Registratie: Juni 2001
  • Laatst online: 10:04

beany

Meeheheheheh

Soultaker schreef op 07 February 2003 @ 17:44:
Ik denk dat je je nog eens goed achter de oren moet krabben, als je met partition tables en master boot records gaat spelen, maar geen idee hebt wat een array in C/C++ is (of wat voor operaties je er op kunt toepassen). Maar goed, laat mij je lol niet verpesten. Ik kan je echter wel aanraden om niets terug te schrijven tot je een heel goed idee hebt waar je mee bezig bent. :P
sssssssssst. nou verpest je het voor ons allemaal ;)

Dagelijkse stats bronnen: https://x.com/GeneralStaffUA en https://www.facebook.com/GeneralStaff.ua


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 20-08 14:20
Ja er zat een stomme fout in... maar nu werkt alles: ik kan mbr lezen, partities lezen, volume id's (boot sector) lezen en alles files & directories....

if broken it is, fix it you should


Verwijderd

Tja... en toen bleek er toch een verschil te zijn tussen shift-left/shift-right op een char/int/dword of elementen binnen een array willen moven ;)

(memcpy anyone..?)
Pagina: 1