Avatar billede karlshoj Nybegynder
03. december 2001 - 20:38 Der er 8 kommentarer og
1 løsning

Hjælp til opdeling af DWord til flere BYTE

I forbindelse med at jeg skal sende en læst fil, skal jeg bruge længden af denne i VC++

Læser filen på følgende måde, og få derved \"read\" som angiver antal læse byte.

BYTE data[50]=\"\";
DWORD read;   
ReadFile(hf,data,sizeof(data),&read,NULL)   

Nu vil jeg gerne have de læste antal byte delt op i byte, så jeg kan ligge dem ind i f.eks inbyte[0], inbyte[1] og inbyte[2]. Så jeg derved kan sende tallet afsted en BYTE af gangen og samle det igen på den anden side til et DWORD.

Jeg havde forestillet mig noget med at i inbyte[0] ligger de mest betydende bit osv. til de mindst betydende i inbyte[2]. Men kan ikke rigtigt finde en funktion til det.

Og regne det manuelt ud, virker lidt voldsomt. Håber at der er en som kan hjælpe med dette :-)
Avatar billede jpk Nybegynder
03. december 2001 - 20:50 #1
Du kan bruge makroer som disse til at hente en byte ud af gangen:

#define GetB(rgb) ((BYTE)(rgb))
#define GetG(rgb) ((BYTE)(((WORD)(rgb)) >> 8))
#define GetR(rgb) ((BYTE)((rgb)>>16))
#define GetA(rgb) ((BYTE)((rgb)>>24))

Avatar billede jpk Nybegynder
03. december 2001 - 20:54 #2
Hmm, hvad mener du med \"have de læste antal byte delt op i byte\"?
Avatar billede karlshoj Nybegynder
03. december 2001 - 20:59 #3
Ok, men hvor kan jeg finde mere om dette? synes ikke lige MSDN giver noget

Hvis det nu er tallet 65290 så skulle det jo gerne ende i inBYTE[0]=FF og inBYTE[1]=0A osv. alt efter hvor stort tallet er.
Avatar billede jpk Nybegynder
03. december 2001 - 21:20 #4
Jeg ved ikke om der står noget i MSDN om det, men du gør bare således:

#define GetB1(dw) ((BYTE)(dw))
#define GetB2(dw) ((BYTE)(((WORD)(dw)) >> 8))
#define GetB3(dw) ((BYTE)((dw)>>16))
#define GetB4(dw) ((BYTE)((dw)>>24))

DWORD Val = 65290;
BYTE b1 = GetB1(Val);
BYTE b2 = GetB2(Val);
osv...

Avatar billede karlshoj Nybegynder
03. december 2001 - 21:32 #5
Takker det virker jo bare :-) Og tak for den hurtige hjælp.

Du skal nok få point, men lige en sidste ting. Når man nu skal den anden vej og har FF, 0A og vil have dem tilbage i en DWORD ovre på den anden maskine?
Avatar billede jpk Nybegynder
03. december 2001 - 21:42 #6
Det er vel noget lign.:

#define GetDWORD(b1,b2,b3,b4) \\
    ((DWORD)((((b1)&0xff)<<24)|(((b2)&0xff)<<16)|(((b3)&0xff)<<8)|((b4)&0xff)))

Du må lige checke den!

Avatar billede karlshoj Nybegynder
03. december 2001 - 21:45 #7
Du skal have mange tak for hjælpe, det har jeg brugt meget lang tid på at finde en løsning på, så nu kan jeg kommer videre :-)
Avatar billede soepro Nybegynder
04. december 2001 - 10:10 #8
union
{
DWORD asDWord;
BYTE  asByte[4];
} val;

val.asDWord = 65290;

for (int idx = 0; idx < sizeof(val); idx++)
  printf(\"Byte %d er %x\", idx, val.asByte[idx]);
Avatar billede soepro Nybegynder
04. december 2001 - 10:11 #9
Så er du fri for at shifte frem og tilbage.
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