|  | 		    
					
        
         
          
         
	
          | |  | Type casts Fra : Jan Thogersen
 | 
 Dato :  08-04-06 00:00
 | 
 |  | Hej,
 
 Jeg sidder her med et lille problem... jeg har gjort det gør men kan
 simpelthen ikke huske hvordan.
 
 Jeg har en buffer:
 
 unsigned char _FF_Buf[512];
 
 Nu vil jeg så gerne fange nogle unsigned int's fra den buffer. Og det
 kan gøres med type casts jeg kan bare ikke huske syntaxen.
 
 MyInt = (unsigned int) _FF_Buf+index;
 
 Kan nogen hjælpe mig her?
 
 Mvh
 Jan Thogersen
 
 
 |  |  | 
  Arne Vajhøj (08-04-2006) 
 
	
          | |  | Kommentar Fra : Arne Vajhøj
 | 
 Dato :  08-04-06 00:27
 | 
 |  | Jan Thogersen wrote:
 > Jeg sidder her med et lille problem... jeg har gjort det gør men kan
 > simpelthen ikke huske hvordan.
 >
 > Jeg har en buffer:
 >
 > unsigned char _FF_Buf[512];
 >
 > Nu vil jeg så gerne fange nogle unsigned int's fra den buffer. Og det
 > kan gøres med type casts jeg kan bare ikke huske syntaxen.
 >
 > MyInt = (unsigned int) _FF_Buf+index;
 >
 > Kan nogen hjælpe mig her?
 
 MyInt = (unsigned int) _FF_Buf[index];
 
 vil konvertere en unsigned char til en unsigned int
 
 MyInt = *((unsigned int *) &_FF_Buf[index]);
 
 vil konvertere et antal unsigned chars til en
 unsigned int
 
 ARne
 
 
 
 |  |  | 
  Igor V. Rafienko (08-04-2006) 
 
	
          | |  | Kommentar Fra : Igor V. Rafienko
 | 
 Dato :  08-04-06 12:34
 | 
 |  | [ Arne Vajhøj ]
 
 [ ... ]
 
 > > Jeg har en buffer:
 > >
 > > unsigned char _FF_Buf[512];
 
 [ ... ]
 
 > MyInt = *((unsigned int *) &_FF_Buf[index]);
 >
 > vil konvertere et antal unsigned chars til en unsigned int
 
 
 Nei.
 
 
 
 
 
 ivr
 --
 "...but it's HDTV -- it's got a better resolution than the real world."
 -- Fry, "When aliens attack"
 
 
 |  |  | 
   Arne Vajhøj (08-04-2006) 
 
	
          | |  | Kommentar Fra : Arne Vajhøj
 | 
 Dato :  08-04-06 16:50
 | 
 |  | Igor V. Rafienko wrote:
 > [ Arne Vajhøj ]
 >> MyInt = *((unsigned int *) &_FF_Buf[index]);
 >>
 >> vil konvertere et antal unsigned chars til en unsigned int
 >
 > Nei.
 
 Jo.
 
 Den sætning flytter et antal bytes fra en adresse i
 memory der af C opfattes som et antal unsigned chars til det samme
 antal bytes på en anden adresse i memory som af C opfattes
 som en en unsigned integer.
 
 Hvad der præcis sker afhænger af om int er 2 eller 4 eller
 8 byte og fortolkningen af resultatet afhænger af om maskinen
 er little eller big endian.
 
 Arne
 
 
 
 
 |  |  | 
    Igor V. Rafienko (08-04-2006) 
 
	
          | |  | Kommentar Fra : Igor V. Rafienko
 | 
 Dato :  08-04-06 22:58
 | 
 |  | [ Arne Vajhøj ]
 
 [ ... ]
 
 > > > MyInt = *((unsigned int *) &_FF_Buf[index]);
 > > >
 > > > vil konvertere et antal unsigned chars til en unsigned int
 > >
 > > Nei.
 >
 > Jo.
 
 
 Nei.
 
 
 > Den sætning flytter et antal bytes fra en adresse i memory der af C
 > opfattes som et antal unsigned chars til det samme antal bytes på en
 > anden adresse i memory som af C opfattes som en en unsigned integer.
 
 
 Nei, det gjør den aldeles ikke.
 
 $ cat end.c
 int
 main()
 {
 unsigned char buf[10] = { 0 };
 
 return *((unsigned int*) &buf[1]);
 }
 $ gcc end.c
 $ ./a.out
 Bus Error
 $
 
 Dagens trivia -- hvorfor skjer dette?
 
 Løsningen med shift / multiplikasjon er den eneste portable. Hverken C
 eller C++ garanterer fornuftige resultater med forslaget med typecast.
 
 
 
 
 
 ivr
 --
 "...but it's HDTV -- it's got a better resolution than the real world."
 -- Fry, "When aliens attack"
 
 
 |  |  | 
     Arne Vajhøj (08-04-2006) 
 
	
          | |  | Kommentar Fra : Arne Vajhøj
 | 
 Dato :  08-04-06 23:26
 | 
 |  | Igor V. Rafienko wrote:
 > Nei, det gjør den aldeles ikke.
 >
 > $ cat end.c
 > int
 > main()
 > {
 >     unsigned char buf[10] = { 0 };
 >
 >     return *((unsigned int*) &buf[1]);
 > }
 > $ gcc end.c
 > $ ./a.out
 > Bus Error
 > $
 >
 > Dagens trivia -- hvorfor skjer dette?
 >
 > Løsningen med shift / multiplikasjon er den eneste portable. Hverken C
 > eller C++ garanterer fornuftige resultater med forslaget med typecast.
 
 Fordi du kører på en lidt gammeldags processor formentlig
 en SPARC som ikke kan lide unaligned integers.
 
 Men det er da en relevant pointe som jeg havde glemt alt om
 (det er mange år siden jeg sidst har set det problem).
 
 Arne
 
 
 |  |  | 
      Igor V. Rafienko (08-04-2006) 
 
	
          | |  | Kommentar Fra : Igor V. Rafienko
 | 
 Dato :  08-04-06 23:46
 | 
 |  | [ Arne Vajhøj ]
 
 [ ... ]
 
 > Fordi du kører på en lidt gammeldags processor formentlig en SPARC
 > som ikke kan lide unaligned integers.
 
 
 Eh, verden er ikke x86. En rekke platformer enten krever eller kan
 kjøres med alignmentbegrensninger.
 
 Men det er egentlig på siden av saken -- selv på en platform uten
 alignmentkrav er ikke typecast garantert å fungere. Det finnes nemlig
 ingen typecasts som kan brukes her.
 
 [ ... ]
 
 
 
 
 
 ivr
 --
 "...but it's HDTV -- it's got a better resolution than the real world."
 -- Fry, "When aliens attack"
 
 
 |  |  | 
      Kent Friis (09-04-2006) 
 
	
          | |  | Kommentar Fra : Kent Friis
 | 
 Dato :  09-04-06 10:12
 | 
 |  | Den Sat, 08 Apr 2006 18:25:37 -0400 skrev Arne Vajhøj:
 > Igor V. Rafienko wrote:
 >>
 >> Dagens trivia -- hvorfor skjer dette?
 >>
 >> Løsningen med shift / multiplikasjon er den eneste portable. Hverken C
 >> eller C++ garanterer fornuftige resultater med forslaget med typecast.
 >
 > Fordi du kører på en lidt gammeldags processor formentlig
 > en SPARC som ikke kan lide unaligned integers.
 
 "Lidt gammeldags"?
 
 Er en CPU nu gammeldags hvis den ikke er opstået ved at klytte 32-bit
 instruktioner ovenpå en uheldig blanding af en 16-bit og 8-bit CPU
 der vist nok er bagudkompatibel med den oprindelige 4-bit Intel 4004?
 
 Det er ikke fordi det er en fordel med unaligned access at Intel
 CPU'er kan det, faktisk gør de fleste compilere hvad de kan for at
 undgå det, for det er langsomt. Det er fordi at hvis man fjernede
 muligheden, ville man få problemer med bagudcompatibiliteten med
 gode gamle 16- og 8-bit programmer.
 
 > Men det er da en relevant pointe som jeg havde glemt alt om
 > (det er mange år siden jeg sidst har set det problem).
 
 Kom ud af 8-bit bagudkompatibilitets-verdenen, så vil du se det i
 stribevis.
 
 Hvad med Itanium - Intels "Nu har vi fået nok af det her gamle
 lort, lad os lave en moderne CPU", hvordan tror du den har det med
 unaligned Access?
 
 Mvh
 Kent
 --
 Hard work may pay off in the long run, but laziness pays off right now.
 
 
 |  |  | 
       Arne Vajhøj (10-04-2006) 
 
	
          | |  | Kommentar Fra : Arne Vajhøj
 | 
 Dato :  10-04-06 00:47
 | 
 |  | Kent Friis wrote:
 > Den Sat, 08 Apr 2006 18:25:37 -0400 skrev Arne Vajhøj:
 >> Fordi du kører på en lidt gammeldags processor formentlig
 >> en SPARC som ikke kan lide unaligned integers.
 >
 > "Lidt gammeldags"?
 >
 > Er en CPU nu gammeldags hvis den ikke er opstået ved at klytte 32-bit
 > instruktioner ovenpå en uheldig blanding af en 16-bit og 8-bit CPU
 > der vist nok er bagudkompatibel med den oprindelige 4-bit Intel 4004?
 
 Lidt modificeret version af en gammel anti-MS vits.
 
 Men Alpha og PPC matcher vist ikke beskrivelsen.
 
 > Det er ikke fordi det er en fordel med unaligned access at Intel
 > CPU'er kan det, faktisk gør de fleste compilere hvad de kan for at
 > undgå det, for det er langsomt. Det er fordi at hvis man fjernede
 > muligheden, ville man få problemer med bagudcompatibiliteten med
 > gode gamle 16- og 8-bit programmer.
 
 Der er ikke nogen 8 bit mode i x86.
 
 Jeg kan ikke umiddelbart se nogen grund til at man ikke skulle
 kunne tillade unaligned data access i 16 bit mode og ikke tillade
 det i 32 bit mode. Data tilgang er jo i forvejen total forskellig.
 
 Så det kan vist ikke være forklaringen. Snarere noget med
 service overfor programmørerne.
 
 >> Men det er da en relevant pointe som jeg havde glemt alt om
 >> (det er mange år siden jeg sidst har set det problem).
 >
 > Kom ud af 8-bit bagudkompatibilitets-verdenen, så vil du se det i
 > stribevis.
 
 M68K (undtagen første generation), x86, VAX, Alpha,
 PPC (for integer) kan alle håndtere unaligned data.
 
 Det er kun SPARC, PA og MIPS af de klassiske
 processor arkitekturer som ikke kan håndtere
 unaligned data.
 
 (og jeg har primært kodet på 64 bit systemer siden 1994)
 
 > Hvad med Itanium - Intels "Nu har vi fået nok af det her gamle
 > lort, lad os lave en moderne CPU", hvordan tror du den har det med
 > unaligned Access?
 
 Itanium er lidt speciel derved at den bruger et mix af
 hardware og software meget a la support for virtual memory.
 
 Linux og OpenVMS håndterer unaligned data access.
 
 Af årsager ukendt for mig gør Windows 64 bit det ikke
 default (man skal kalde SetErrorMode med SEM_NOALIGNMENTFAULTEXCEPT).
 
 [og jeg skal ikke forsøge at gøre mig klog på HP-UX's
 uransagelige verden]
 
 Arne
 
 
 |  |  | 
        Kent Friis (10-04-2006) 
 
	
          | |  | Kommentar Fra : Kent Friis
 | 
 Dato :  10-04-06 08:36
 | 
 |  | Den Sun, 09 Apr 2006 19:47:08 -0400 skrev Arne Vajhøj:
 > Kent Friis wrote:
 >> Den Sat, 08 Apr 2006 18:25:37 -0400 skrev Arne Vajhøj:
 >>> Fordi du kører på en lidt gammeldags processor formentlig
 >>> en SPARC som ikke kan lide unaligned integers.
 >>
 >> "Lidt gammeldags"?
 >>
 >> Er en CPU nu gammeldags hvis den ikke er opstået ved at klytte 32-bit
 >> instruktioner ovenpå en uheldig blanding af en 16-bit og 8-bit CPU
 >> der vist nok er bagudkompatibel med den oprindelige 4-bit Intel 4004?
 >
 > Lidt modificeret version af en gammel anti-MS vits.
 
 Ja.
 
 > Men Alpha og PPC matcher vist ikke beskrivelsen.
 
 Alpha var vel nærmest bygget til WinNT, så det kan ikke overraske. Hvad
 IBM og Motorolas undskyldning er ved jeg ikke.
 
 >> Det er ikke fordi det er en fordel med unaligned access at Intel
 >> CPU'er kan det, faktisk gør de fleste compilere hvad de kan for at
 >> undgå det, for det er langsomt. Det er fordi at hvis man fjernede
 >> muligheden, ville man få problemer med bagudcompatibiliteten med
 >> gode gamle 16- og 8-bit programmer.
 >
 > Der er ikke nogen 8 bit mode i x86.
 
 Men dog AL/AH osv registrene, der lugter ret meget derhendad.
 
 > Jeg kan ikke umiddelbart se nogen grund til at man ikke skulle
 > kunne tillade unaligned data access i 16 bit mode og ikke tillade
 > det i 32 bit mode. Data tilgang er jo i forvejen total forskellig.
 >
 > Så det kan vist ikke være forklaringen. Snarere noget med
 > service overfor programmørerne.
 
 Compileren har altså været opfundet i mange år, så den tror jeg ikke
 på. Specielt ikke på en CPU-arkitektur der har ry for at være så
 programmør-fjendtlig som x86.
 
 >>> Men det er da en relevant pointe som jeg havde glemt alt om
 >>> (det er mange år siden jeg sidst har set det problem).
 >>
 >> Kom ud af 8-bit bagudkompatibilitets-verdenen, så vil du se det i
 >> stribevis.
 >
 > M68K (undtagen første generation), x86, VAX, Alpha,
 > PPC (for integer) kan alle håndtere unaligned data.
 >
 > Det er kun SPARC, PA og MIPS af de klassiske
 > processor arkitekturer som ikke kan håndtere
 > unaligned data.
 
 Hvor passer POWER ind?
 
 > (og jeg har primært kodet på 64 bit systemer siden 1994)
 >
 >> Hvad med Itanium - Intels "Nu har vi fået nok af det her gamle
 >> lort, lad os lave en moderne CPU", hvordan tror du den har det med
 >> unaligned Access?
 >
 > Itanium er lidt speciel derved at den bruger et mix af
 > hardware og software meget a la support for virtual memory.
 >
 > Linux og OpenVMS håndterer unaligned data access.
 >
 > Af årsager ukendt for mig gør Windows 64 bit det ikke
 > default (man skal kalde SetErrorMode med SEM_NOALIGNMENTFAULTEXCEPT).
 
 Underlig arkitektur.
 
 Mvh
 Kent
 --
 Hard work may pay off in the long run, but laziness pays off right now.
 
 
 |  |  | 
         Arne Vajhøj (10-04-2006) 
 
	
          | |  | Kommentar Fra : Arne Vajhøj
 | 
 Dato :  10-04-06 23:54
 | 
 |  | Kent Friis wrote:
 > Den Sun, 09 Apr 2006 19:47:08 -0400 skrev Arne Vajhøj:
 >> Men Alpha og PPC matcher vist ikke beskrivelsen.
 >
 > Alpha var vel nærmest bygget til WinNT, så det kan ikke overraske. Hvad
 > IBM og Motorolas undskyldning er ved jeg ikke.
 
 Nope.
 
 Alpha blev lavet til DEC OSF/1 og VMS.
 
 Windows NT supporten kom senere.
 
 I forbindelse med Windows NT supporten tilføjede
 de nogle instruktioner til Alpha arkitekturen (jeg er
 dog ikke klar over om det var nødvendigt for at NT kunne
 køre eller kun nødvendigt for typiske Windows applikationer
 performede godt).
 
 >> M68K (undtagen første generation), x86, VAX, Alpha,
 >> PPC (for integer) kan alle håndtere unaligned data.
 >>
 >> Det er kun SPARC, PA og MIPS af de klassiske
 >> processor arkitekturer som ikke kan håndtere
 >> unaligned data.
 >
 > Hvor passer POWER ind?
 
 POWER = PPC
 
 Den håndterer unaligned integers, men ikke unaligned
 floating point.
 
 >> Itanium er lidt speciel derved at den bruger et mix af
 >> hardware og software meget a la support for virtual memory.
 >>
 >> Linux og OpenVMS håndterer unaligned data access.
 >>
 >> Af årsager ukendt for mig gør Windows 64 bit det ikke
 >> default (man skal kalde SetErrorMode med SEM_NOALIGNMENTFAULTEXCEPT).
 >
 > Underlig arkitektur.
 
 Itanium er faktisk på mange måder en anderledes
 men spændende arkitektur.
 
 Arne
 
 
 |  |  | 
     Arne Vajhøj (10-04-2006) 
 
	
          | |  | Kommentar Fra : Arne Vajhøj
 | 
 Dato :  10-04-06 00:50
 | 
 |  | Igor V. Rafienko wrote:
 > Løsningen med shift / multiplikasjon er den eneste portable.
 
 Bemærk at i portabilitets perspektiv gør shift/multiplikation
 ikke det samme som den cast gør (eller forsøger at gøre).
 
 Hvis man vil have samme funktionalitet på en sikker måde
 er det nemmeste sikkert memcpy.
 
 Arne
 
 
 |  |  | 
      Igor V. Rafienko (10-04-2006) 
 
	
          | |  | Kommentar Fra : Igor V. Rafienko
 | 
 Dato :  10-04-06 11:54
 | 
 |  | [ Arne Vajhøj ]
 
 [ ... ]
 
 > > Løsningen med shift / multiplikasjon er den eneste portable.
 >
 > Bemærk at i portabilitets perspektiv gør shift/multiplikation ikke
 > det samme som den cast gør (eller forsøger at gøre).
 
 
 Det er ingen grunn til å anta at typecast vil virke, da
 språkdefinisjonen ikke krevere denne oppførselen.
 
 En skift / multiplikasjonsløsning er, så vidt jeg ser, den eneste
 portable.
 
 
 > Hvis man vil have samme funktionalitet på en sikker måde er det
 > nemmeste sikkert memcpy.
 
 
 .... Da forutsetter du at en int har den eksakt samme
 bitrepresentasjonen som N chars plassert etter hverandre. Den
 antagelsen finner jeg intet grunnlag for i standarden.
 
 
 
 
 
 ivr
 --
 "...but it's HDTV -- it's got a better resolution than the real world."
 -- Fry, "When aliens attack"
 
 
 |  |  | 
       Arne Vajhøj (11-04-2006) 
 
	
          | |  | Kommentar Fra : Arne Vajhøj
 | 
 Dato :  11-04-06 00:05
 | 
 |  | Igor V. Rafienko wrote:
 > [ Arne Vajhøj ]
 >> Bemærk at i portabilitets perspektiv gør shift/multiplikation ikke
 >> det samme som den cast gør (eller forsøger at gøre).
 >
 > Det er ingen grunn til å anta at typecast vil virke, da
 > språkdefinisjonen ikke krevere denne oppførselen.
 
 C standarden kræver ikke at det virker.
 
 Det virker så tilfældigvis på det store flertal af computere.
 
 Men hvis du læser hvad jeg skrev i parentesen, så snakker
 jeg kun om hvad folk der skriver den slags kode vil forvente
 at koden gør.
 
 Nu er det naturligvis muligt at du tror at folk skriver koden, sådan
 for at få undefined behaviour, men jeg tror altså at folk skriver
 koden sådan for at flytte det antal bits der er i en int.
 
 >> Hvis man vil have samme funktionalitet på en sikker måde er det
 >> nemmeste sikkert memcpy.
 >
 > ... Da forutsetter du at en int har den eksakt samme
 > bitrepresentasjonen som N chars plassert etter hverandre. Den
 > antagelsen finner jeg intet grunnlag for i standarden.
 
 Nej.
 
 Og netop derfor vil memcpy nok være bedst (mest portable) i
 de fleste tilfælde !
 
 Hvis sizeof(int) bytes "indeholder" en int, så er det langt
 mere sandsynligt at de char indeholder bit mønsteret for int
 end nogle numerisk konverterede værdier. Fordi de skal
 jo også derind på et tidspunkt.
 
 Det var dog ikke derfor jeg skrev hvad jeg skrev. Bitmønsteret skal
 nok passe på alle gængse computere.
 
 Men multiplikation/shift bruger fixed endianess, mens memcpy
 bruger host endianess.
 
 Og da den af programmøren tilsigtede virkning af cast
 vil bruge host endianess, så matcher memcpy bedre.
 
 Og endianess er et virkeligt problem.
 
 Arne
 
 
 
 
 |  |  | 
        Igor V. Rafienko (11-04-2006) 
 
	
          | |  | Kommentar Fra : Igor V. Rafienko
 | 
 Dato :  11-04-06 02:19
 | 
 |  | [ Arne Vajhøj ]
 
 [ ... ]
 
 > Det virker så tilfældigvis på det store flertal af computere.
 
 
 Right. Omtrent som i eksempelet mitt.
 
 [ ... ]
 
 
 > Og netop derfor vil memcpy nok være bedst (mest portable) i
 > de fleste tilfælde !
 
 
 Nei. (Fx. når data i char-arrayen er representasjonen av heltall i en
 annen endianess).
 
 
 > Hvis sizeof(int) bytes "indeholder" en int, så er det langt mere
 > sandsynligt at de char indeholder bit mønsteret for int end nogle
 > numerisk konverterede værdier. Fordi de skal jo også derind på et
 > tidspunkt.
 
 
 Og dette sannsynlighetsutsagnet er basert på ... ?
 
 [ ... ]
 
 
 > Men multiplikation/shift bruger fixed endianess, mens memcpy bruger
 > host endianess.
 
 
 Hva *er* det du snakker om? memcpy() har intet begrep om endianess i
 seg. Den vil bare flytte bytes fra en adresse til en annen. Når tallet
 som ligger i char-arrayet er i samme endianess som platformen iøvrig,
 er det bare å kopiere bytes rått (slik som memcpy gjør). Men, som sagt
 tidligere, det trenger ikke å være tilfellet.
 
 memcpy() vil virke bedre enn det horrible typecast-hacket, da man
 kommer seg rundt alignmentproblematikk. Men det vil fremdeles være
 utilstrekkelig.
 
 
 > Og da den af programmøren tilsigtede virkning af cast vil bruge host
 > endianess, så matcher memcpy bedre.
 
 
 Det er bare fjas.
 
 Den eneste måten å gjøre en slik konvertering på, er å avtale på
 forhånd hva denne char-arrayen representerer og i hvilken rekkefølge.
 
 Når denne protokollen er på plass, *kan* det hende at memcpy() passer.
 Men det trenger ikke å være tilfellet. Og når endianess av det som
 ligger i char-arrayen er fastsatt, er det enklere (da det vil virke på
 alle platformer) å komponere sluttresultatet med
 skift/multiplikasjon/or[1]. Dette er en generalisering av det som
 htonl()/ntohl() paret hjelper å løse.
 
 Siden OP unnlot å spesifisere denne protokollen, er det enkleste å
 ikke gjøre noen antagelser om hva som er sannsynlig. Hverken typecast
 eller memcpy() er veien å gå (fordi det første ikke virker, og det
 andre vil gi feil resultat).
 
 [ ... ]
 
 
 
 
 
 ivr
 [1] jeg tror jeg retter det til "de nødvendige operasjonene". Er
 det noen reserverte bits i implementasjonen, vil de måtte settes til
 bestemte verdier før sluttresultatet kan leveres.
 --
 "...but it's HDTV -- it's got a better resolution than the real world."
 -- Fry, "When aliens attack"
 
 
 |  |  | 
         Arne Vajhøj (11-04-2006) 
 
	
          | |  | Kommentar Fra : Arne Vajhøj
 | 
 Dato :  11-04-06 04:10
 | 
 |  | Igor V. Rafienko wrote:
 > [ Arne Vajhøj ]
 >> Det virker så tilfældigvis på det store flertal af computere.
 >
 > Right. Omtrent som i eksempelet mitt.
 
 Ked af at måtte fortælle dig det men flertallet af computere
 kører altså windows/x86 ikke solaris/sparc.
 
 >> Hvis sizeof(int) bytes "indeholder" en int, så er det langt mere
 >> sandsynligt at de char indeholder bit mønsteret for int end nogle
 >> numerisk konverterede værdier. Fordi de skal jo også derind på et
 >> tidspunkt.
 >
 > Og dette sannsynlighetsutsagnet er basert på ... ?
 
 Det kræver mindst kode at skovle en int ind as is.
 
 Gennemsnitsprogrammøren er mageligt anlagt.
 
 >> Men multiplikation/shift bruger fixed endianess, mens memcpy bruger
 >> host endianess.
 >
 > Hva *er* det du snakker om? memcpy() har intet begrep om endianess i
 > seg.  Den vil bare flytte bytes fra en adresse til en annen. Når tallet
 > som ligger i char-arrayet er i samme endianess som platformen iøvrig,
 > er det bare å kopiere bytes rått (slik som memcpy gjør). Men, som sagt
 > tidligere, det trenger ikke å være tilfellet.
 >
 > memcpy() vil virke bedre enn det horrible typecast-hacket, da man
 > kommer seg rundt alignmentproblematikk. Men det vil fremdeles være
 > utilstrekkelig.
 
 Pointen er at typecast hacket flytter med host endianess.
 
 Det samme gør memcpy.
 
 Multiplikation/shift flytter med en fixed endianess.
 
 Derfor er memcpy nok det mest ekvivalente til typecast hacket.
 
 >> Og da den af programmøren tilsigtede virkning af cast vil bruge host
 >> endianess, så matcher memcpy bedre.
 >
 > Det er bare fjas.
 >
 > Den eneste måten å gjøre en slik konvertering på, er å avtale på
 > forhånd hva denne char-arrayen representerer og i hvilken rekkefølge.
 
 Der er sikert en masse man kunne gøres smartere.
 
 Man kunne have en protokol med en fixed endianess.
 
 Måske kunne man bruge en struct.
 
 Man kunne også sige at det var langt nemmere at bruge C# BinaryReader
 eller Java DataInputStream.
 
 O.s.v..
 
 Det ændrer jo ikke på at memcpy gør det samme som typecast hacket
 og at multiplikation/shift ikke gør det.
 
 Jeg finder det lidt grotesk at man i en diskussion om portabilitet
 uden at blinke foreslår at man ændrer koden fra host endianess til
 fixed endianess.
 
 Arne
 
 
 
 
 |  |  | 
          Ivan Johansen (11-04-2006) 
 
	
          | |  | Kommentar Fra : Ivan Johansen
 | 
 Dato :  11-04-06 07:30
 | 
 |  | Arne Vajhøj wrote:
 > Ked af at måtte fortælle dig det men flertallet af computere
 > kører altså windows/x86 ikke solaris/sparc.
 
 Jeg tror du glemmer at tælle embeddede systemer med. I det projekt jeg
 arbejder på har vi ca. 12 processorer hvor kun én er en x86 (80186
 kompatibel) og ingen kører Windows.
 
 Ivan Johansen
 
 
 |  |  | 
           Martin Jørgensen (11-04-2006) 
 
	
          | |  | Kommentar Fra : Martin Jørgensen
 | 
 Dato :  11-04-06 13:46
 | 
 |  | 
 
            Ivan Johansen wrote:
 > Arne Vajhøj wrote:
 > 
 >> Ked af at måtte fortælle dig det men flertallet af computere
 >> kører altså windows/x86 ikke solaris/sparc.
 > 
 > 
 > Jeg tror du glemmer at tælle embeddede systemer med. I det projekt jeg 
 > arbejder på har vi ca. 12 processorer hvor kun én er en x86 (80186 
 > kompatibel) og ingen kører Windows.
 Hvad er det "embeddede systemer" dækker over? Nu er jeg stødt på den 
 formulering et par gange, uden at vide hvad det er... Er det noget 
 linux-halløj?
 Best regards / Med venlig hilsen
 Martin Jørgensen
 -- 
 ---------------------------------------------------------------------------
 Home of Martin Jørgensen - http://www.martinjoergensen.dk |  |  | 
            Kent Friis (11-04-2006) 
 
	
          | |  | Kommentar Fra : Kent Friis
 | 
 Dato :  11-04-06 14:07
 | 
 |  | Den Tue, 11 Apr 2006 14:45:40 +0200 skrev Martin Jørgensen:
 > Ivan Johansen wrote:
 >> Arne Vajhøj wrote:
 >>
 >>> Ked af at måtte fortælle dig det men flertallet af computere
 >>> kører altså windows/x86 ikke solaris/sparc.
 >>
 >>
 >> Jeg tror du glemmer at tælle embeddede systemer med. I det projekt jeg
 >> arbejder på har vi ca. 12 processorer hvor kun én er en x86 (80186
 >> kompatibel) og ingen kører Windows.
 >
 > Hvad er det "embeddede systemer" dækker over? Nu er jeg stødt på den
 > formulering et par gange, uden at vide hvad det er... Er det noget
 > linux-halløj?
 
 Det er alt det der ikke er en rigtig computer.
 
 Fx en mobiltelefon eller styredimsen i en vaskemaskine...
 
 "Embedded" ~ "inde i".
 
 Mvh
 Kent
 --
 Hard work may pay off in the long run, but laziness pays off right now.
 
 
 |  |  | 
          Igor V. Rafienko (11-04-2006) 
 
	
          | |  | Kommentar Fra : Igor V. Rafienko
 | 
 Dato :  11-04-06 14:59
 | 
 |  | [ Arne Vajhøj ]
 
 [ ... ]
 
 > Ked af at måtte fortælle dig det men flertallet af computere kører
 > altså windows/x86 ikke solaris/sparc.
 
 
 1) Nei, mesteparten av computere kjører ikke windows/x86, men vi lar
 nå dette ligge (hvor mange mobiltelefoner er det per en stasjonær
 PC i verden?)
 
 2) Ja, det er flere windows/x86 bokser enn Sun solaris. Hva så?
 Typecastforslaget ditt er like defekt uansett hva dette forholdet
 måtte være.
 
 
 [ Arne Vajhøj ]
 > Hvis sizeof(int) bytes "indeholder" en int, så er det langt mere
 > sandsynligt at de char indeholder bit mønsteret for int end nogle
 > numerisk konverterede værdier. Fordi de skal jo også derind på et
 > tidspunkt.
 
 [ ivr ]
 > Og dette sannsynlighetsutsagnet er basert på ... ?
 
 [ Arne Vajhøj ]
 > Det kræver mindst kode at skovle en int ind as is.
 >
 > Gennemsnitsprogrammøren er mageligt anlagt.
 
 
 Hva med å slutte å gjøre antagelser det ikke er grunnlag for og heller
 foreslå en løsning som vil bare virke på alle platformer?
 
 [ ... ]
 
 
 > > Den eneste måten å gjøre en slik konvertering på, er å avtale på
 > > forhånd hva denne char-arrayen representerer og i hvilken
 > > rekkefølge.
 >
 > Der er sikert en masse man kunne gøres smartere.
 :
 > Man kunne også sige at det var langt nemmere at bruge C#
 > BinaryReader eller Java DataInputStream.
 
 
 Fra C? Neppe.
 
 
 > Det ændrer jo ikke på at memcpy gør det samme som typecast hacket og
 > at multiplikation/shift ikke gør det.
 
 
 Nei, memcpy() gjør ikke det samme som typecast-hacket, slik beskrevet
 tidligere.
 
 
 > Jeg finder det lidt grotesk at man i en diskussion om portabilitet
 > uden at blinke foreslår at man ændrer koden fra host endianess til
 > fixed endianess.
 
 
 Jeg finder det temmelig grotesk at i en diskusjon om portabilitet
 kommer du med forslag som vil knekke i helt trivielle situasjoner, og
 attpåtil prøver du å forsvare slike defekte liksomløsninger. Men vi
 har vel krav hver på eget synspunkt.
 
 
 
 
 
 ivr
 --
 "...but it's HDTV -- it's got a better resolution than the real world."
 -- Fry, "When aliens attack"
 
 
 |  |  | 
           Arne Vajhøj (12-04-2006) 
 
	
          | |  | Kommentar Fra : Arne Vajhøj
 | 
 Dato :  12-04-06 02:35
 | 
 |  | Igor V. Rafienko wrote:
 >> Ked af at måtte fortælle dig det men flertallet af computere kører
 >> altså windows/x86 ikke solaris/sparc.
 
 > 2) Ja, det er flere windows/x86 bokser enn Sun solaris. Hva så?
 >    Typecastforslaget ditt er like defekt uansett hva dette forholdet
 >    måtte være.
 
 Det er ca. 8-10 indlæg jeg erkendte den fejl.
 
 Men kun 2-3 indlæg siden du mente at kunne modbevise
 påstanden om de fleste computere med at dit Solaris
 eksempel - hvilket jo enten var totalt irrelevant
 eller måtte være baseret på en antagelse om at Solaris/SPARC
 er mere udbredt end Windows/x86.
 
 >> Det ændrer jo ikke på at memcpy gør det samme som typecast hacket og
 >> at multiplikation/shift ikke gør det.
 >
 > Nei, memcpy() gjør ikke det samme som typecast-hacket, slik beskrevet
 > tidligere.
 
 memcpy gør det som programmøren der vil bruge typecast hacket
 vil.
 
 >> Jeg finder det lidt grotesk at man i en diskussion om portabilitet
 >> uden at blinke foreslår at man ændrer koden fra host endianess til
 >> fixed endianess.
 >
 > Jeg finder det temmelig grotesk at i en diskusjon om portabilitet
 > kommer du med forslag som vil knekke i helt trivielle situasjoner, og
 > attpåtil prøver du å forsvare slike defekte liksomløsninger. Men vi
 > har vel krav hver på eget synspunkt.
 
 Snakker du om typecast haclet eller memcpy ?
 
 Arne
 
 
 |  |  | 
            Igor V. Rafienko (12-04-2006) 
 
	
          | |  | Kommentar Fra : Igor V. Rafienko
 | 
 Dato :  12-04-06 15:26
 | 
 |  | [ Arne Vajhøj ]
 
 [ ... ]
 
 > Men kun 2-3 indlæg siden du mente at kunne modbevise påstanden om de
 > fleste computere med at dit Solaris eksempel - hvilket jo enten var
 > totalt irrelevant eller måtte være baseret på en antagelse om at
 > Solaris/SPARC er mere udbredt end Windows/x86.
 
 
 Huh?
 
 Eksempelet mitt var ment å illustrere at:
 
 "MyInt = *((unsigned int *) &_FF_Buf[index]);
 
 vil konvertere et antal unsigned chars til en unsigned int"
 
 .... var feil. Denne påstanden *er* feil. Det var *alt* jeg skulle
 illustrere. Ikke noe mer. I så måte er det totalt irrelevant hva som
 er forholdet mellom x86 og SPARC arkitekturene.
 
 For det andre, så har jeg aldri nevnt SPARC. *Du* har begynt å gnåle
 om det. Jeg har ikke tenkt å stå for *dine* utsagn, det må du klare på
 egenhånd.
 
 [ ... ]
 
 
 > > > Det ændrer jo ikke på at memcpy gør det samme som typecast
 > > > hacket og at multiplikation/shift ikke gør det.
 > >
 > > Nei, memcpy() gjør ikke det samme som typecast-hacket, slik
 > > beskrevet tidligere.
 >
 > memcpy gør det som programmøren der vil bruge typecast hacket vil.
 
 
 .... som er fremdeles annerledes enn typecast-hacket. Du har jo
 allerede fått et eksempel på det!
 
 La meg legge frem en dårlig forenkling: på en elendighetsskala fra 0
 til 10, der 10 betyr "virker" og alt under "5" er en klar kandidat til
 dailywtf, kan man trygt spre forslagene slik:
 
 0                                    10
 rå typecast     memcpy       manuell sammensetting av tallet
 
 memcpy _er_ et skritt i riktig retning, men det skrittet er ikke langt
 nok. Vil du ha forklart _en gang til_ hvorfor?
 
 [ ... ]
 
 
 > > Jeg finder det temmelig grotesk at i en diskusjon om portabilitet
 > > kommer du med forslag som vil knekke i helt trivielle situasjoner,
 > > og attpåtil prøver du å forsvare slike defekte liksomløsninger.
 > > Men vi har vel krav hver på eget synspunkt.
 >
 > Snakker du om typecast haclet eller memcpy ?
 
 
 Her er kjernen til problemet: *begge* er defekte.
 
 
 
 
 
 ivr
 --
 "...but it's HDTV -- it's got a better resolution than the real world."
 -- Fry, "When aliens attack"
 
 
 |  |  | 
             Kent Friis (12-04-2006) 
 
	
          | |  | Kommentar Fra : Kent Friis
 | 
 Dato :  12-04-06 16:03
 | 
 |  | Den 12 Apr 2006 16:25:35 +0200 skrev Igor V. Rafienko:
 >
 > La meg legge frem en dårlig forenkling: på en elendighetsskala fra 0
 > til 10, der 10 betyr "virker" og alt under "5" er en klar kandidat til
 > dailywtf, kan man trygt spre forslagene slik:
 >
 >       0                                    10
 >  rå typecast     memcpy       manuell sammensetting av tallet
 >
 > memcpy _er_ et skritt i riktig retning, men det skrittet er ikke langt
 > nok. Vil du ha forklart _en gang til_ hvorfor?
 
 Jeg tror efterhånden vi alle savner en forklaring på hvorfor memcpy
 ikke duer til at flytte et antal bytes i host byte order over i en int.
 
 Og næste spørgsmål bliver så hvordan man skriver portabel kode med
 shifts til at flytte et antal bytes i host byte order over i en int.
 
 Mvh
 Kent
 --
 Hard work may pay off in the long run, but laziness pays off right now.
 
 
 |  |  | 
              Mogens Hansen (12-04-2006) 
 
	
          | |  | Kommentar Fra : Mogens Hansen
 | 
 Dato :  12-04-06 16:50
 | 
 |  | 
 "Kent Friis" <nospam@nospam.invalid> wrote in message
 news:443d16a7$0$15794$14726298@news.sunsite.dk...
 
 [8<8<8<]
 > Jeg tror efterhånden vi alle savner en forklaring på hvorfor memcpy
 > ikke duer til at flytte et antal bytes i host byte order over i en int.
 
 Det dur (i C++ kun for POD typer).
 Det er meget omhyggeligt specificer et at det dur - og så vidt jeg
 umiddelbart ved det eneste der dur.
 I C++ Standarden (C++98) er det beskrevet i §3.9-2.
 I C Standarden (C99 draft) er det beskrevet i §6.2.6.1
 
 Venlig hilsen
 
 Mogens Hansen
 
 
 
 
 |  |  | 
              Igor V. Rafienko (12-04-2006) 
 
	
          | |  | Kommentar Fra : Igor V. Rafienko
 | 
 Dato :  12-04-06 20:11
 | 
 |  | [ Kent Friis ]
 
 [ ... ]
 
 > Jeg tror efterhånden vi alle savner en forklaring på hvorfor memcpy
 > ikke duer til at flytte et antal bytes i host byte order over i en
 > int.
 
 
 *Når* sa OP noe om endianess eller representasjonen av int'ene som lå
 i dette char-arrayet? For å eksemplifisere: i denne nettverksalderen
 kunne slike int'er godt ha vært sendt over nettverket, lest vha.
 read() inn i et char-array, og så oppstår det et behov for å
 tolke verdien.
 
 *Men* siden OP *unnlot* å si noe som helst om representasjonen, er det
 uhyre teit å spekulere om hva man kanskje muligens skulle hatt behov
 for og basere et løsningsforslag på slike antagelser.
 
 
 > Og næste spørgsmål bliver så hvordan man skriver portabel kode med
 > shifts til at flytte et antal bytes i host byte order over i en int.
 
 
 .... såsnart OP forteller hvordan disse int'ene er representert i
 minne.
 
 
 
 
 
 ivr
 --
 "...but it's HDTV -- it's got a better resolution than the real world."
 -- Fry, "When aliens attack"
 
 
 |  |  | 
               Kent Friis (12-04-2006) 
 
	
          | |  | Kommentar Fra : Kent Friis
 | 
 Dato :  12-04-06 20:22
 | 
 |  | Den 12 Apr 2006 21:10:40 +0200 skrev Igor V. Rafienko:
 > [ Kent Friis ]
 >
 > [ ... ]
 >
 >> Jeg tror efterhånden vi alle savner en forklaring på hvorfor memcpy
 >> ikke duer til at flytte et antal bytes i host byte order over i en
 >> int.
 >
 >
 > *Når* sa OP noe om endianess eller representasjonen av int'ene som lå
 > i dette char-arrayet?
 
 Det gjorde han ikke, og derfor kan vi ikke antage hverken det ene
 eller det andet.
 
 Men det du svarede på var en påstand om at memcpy var en brugbar
 løsning ved host byte order. Og det er her uenigheden opstår, når
 du siger memcpy ikke duer.
 
 Der er ingen der har sagt den var brugbar ved network byte order.
 
 > For å eksemplifisere: i denne nettverksalderen
 > kunne slike int'er godt ha vært sendt over nettverket, lest vha.
 > read() inn i et char-array, og så oppstår det et behov for å
 > tolke verdien.
 
 Blandt typiske Windows-udviklere, er de stadig i host byte order. Derfor
 kan du ikke antage hverken det ene eller det andet.
 
 > *Men* siden OP *unnlot* å si noe som helst om representasjonen, er det
 > uhyre teit å spekulere om hva man kanskje muligens skulle hatt behov
 > for og basere et løsningsforslag på slike antagelser.
 
 Derfor blev løsningen med memcpy præsenteret som løsningen på
 problem A, og shifts som løsning på problem B. Så kan han jo vurdere
 om det er problem A eller B han forsøger at løse.
 
 Det kan han så bare ikke alligevel, for der er jo nogen der siger
 at alle løsningsforslag på problem A ikke duer, og så står han med
 kun en løsning på problem B, og indtryk af at problem A slet ikke
 kan løses.
 
 >> Og næste spørgsmål bliver så hvordan man skriver portabel kode med
 >> shifts til at flytte et antal bytes i host byte order over i en int.
 >
 > ... såsnart OP forteller hvordan disse int'ene er representert i
 > minne.
 
 Nå, må vi andre nu ikke stille spørgsmål? Eller kræver du en ny tråd
 per tillægsspørgsmål?
 
 Mvh
 Kent
 --
 Hard work may pay off in the long run, but laziness pays off right now.
 
 
 |  |  | 
                Igor V. Rafienko (13-04-2006) 
 
	
          | |  | Kommentar Fra : Igor V. Rafienko
 | 
 Dato :  13-04-06 11:29
 | 
 |  | [ Kent Friis ]
 
 [ ... ]
 
 > > *Når* sa OP noe om endianess eller representasjonen av int'ene som
 > > lå i dette char-arrayet?
 >
 > Det gjorde han ikke, og derfor kan vi ikke antage hverken det ene
 > eller det andet.
 
 
 Nettopp.
 
 
 > Men det du svarede på var en påstand om at memcpy var en brugbar
 > løsning ved host byte order. Og det er her uenigheden opstår, når du
 > siger memcpy ikke duer.
 
 
 Jeg ser ikke noe reservasjon om endianess i
 <news:%4h_f.1474$EA3.307@dukeread10>, gjør du det? Og endianess er
 bare en liten del av problemet, nettopp fordi det er *så* mange måter
 å representere et tall på.
 
 memcpy vil virke, når man *internt* i programmet gjør int -> char[] ->
 int konverteringen. *Alt* det andre kan ofte virke, men *trenger* ikke
 det.
 
 [ ... ]
 
 
 > Blandt typiske Windows-udviklere, er de stadig i host byte order.
 > Derfor kan du ikke antage hverken det ene eller det andet.
 
 
 Det er derfor man lager seg protokoller for å representere data sendt
 over nettverket. Når det er fastsatt, er det ingenting mer "å anta".
 
 [ ... ]
 
 
 > Det kan han så bare ikke alligevel, for der er jo nogen der siger at
 > alle løsningsforslag på problem A ikke duer, og så står han med kun
 > en løsning på problem B, og indtryk af at problem A slet ikke kan
 > løses.
 
 
 *Hvem* påstod noe slikt her?
 
 [ ... hvordan skrive portabel kode for char[] -> int ]
 
 
 > Nå, må vi andre nu ikke stille spørgsmål?
 
 
 Jeg venter kun på int-represntasjonen til OP. Dersom du vet hva
 han/hun ville, for all del, spesefiser det.
 
 
 > Eller kræver du en ny tråd per tillægsspørgsmål?
 
 
 Nei. Alt jeg vil vite er representasjonen av int'er i char[]. Om det
 skulle være en ny tråd av det er egentlig temmelig likegyldig.
 
 
 
 
 
 ivr
 --
 "...but it's HDTV -- it's got a better resolution than the real world."
 -- Fry, "When aliens attack"
 
 
 |  |  | 
                 Kent Friis (13-04-2006) 
 
	
          | |  | Kommentar Fra : Kent Friis
 | 
 Dato :  13-04-06 13:02
 | 
 |  | Den 13 Apr 2006 12:29:14 +0200 skrev Igor V. Rafienko:
 > [ Kent Friis ]
 >
 > [ ... ]
 >
 >> > *Når* sa OP noe om endianess eller representasjonen av int'ene som
 >> > lå i dette char-arrayet?
 >>
 >> Det gjorde han ikke, og derfor kan vi ikke antage hverken det ene
 >> eller det andet.
 >
 >
 > Nettopp.
 >
 >
 >> Men det du svarede på var en påstand om at memcpy var en brugbar
 >> løsning ved host byte order. Og det er her uenigheden opstår, når du
 >> siger memcpy ikke duer.
 >
 >
 > Jeg ser ikke noe reservasjon om endianess i
 > <news:%4h_f.1474$EA3.307@dukeread10>, gjør du det? Og endianess er
 > bare en liten del av problemet, nettopp fordi det er *så* mange måter
 > å representere et tall på.
 
 Det er underforstået i "Hvis man vil have samme funktionalitet". Da
 cast'en (i de tilfælde hvor den virker) er host byte order.
 
 Det kunne måske have været tydeligere, men jeg er ikke i tvivl om at
 det skulle forstås sådan.
 
 > memcpy vil virke, når man *internt* i programmet gjør int -> char[] ->
 > int konverteringen. *Alt* det andre kan ofte virke, men *trenger* ikke
 > det.
 >
 >> Blandt typiske Windows-udviklere, er de stadig i host byte order.
 >> Derfor kan du ikke antage hverken det ene eller det andet.
 >
 > Det er derfor man lager seg protokoller for å representere data sendt
 > over nettverket. Når det er fastsatt, er det ingenting mer "å anta".
 
 Sålænge vi ikke kender protokollerne, kan vi ikke andet end antage (og
 spørge).
 
 > [ ... ]
 >
 >
 >> Det kan han så bare ikke alligevel, for der er jo nogen der siger at
 >> alle løsningsforslag på problem A ikke duer, og så står han med kun
 >> en løsning på problem B, og indtryk af at problem A slet ikke kan
 >> løses.
 >
 >
 > *Hvem* påstod noe slikt her?
 
 Alle de forslag der indtil videre er kommet med host byte order (cast,
 memcpy) gav du indtryk af var ubrugelige.
 
 > [ ... hvordan skrive portabel kode for char[] -> int ]
 >
 >> Nå, må vi andre nu ikke stille spørgsmål?
 >
 > Jeg venter kun på int-represntasjonen til OP. Dersom du vet hva
 > han/hun ville, for all del, spesefiser det.
 
 Jeg ved det ikke, men jeg kunne stadig godt tænke mig at vide hvordan
 du mener det bør gøres.
 
 >> Eller kræver du en ny tråd per tillægsspørgsmål?
 >
 > Nei. Alt jeg vil vite er representasjonen av int'er i char[]. Om det
 > skulle være en ny tråd av det er egentlig temmelig likegyldig.
 
 Viden om hvordan OP's protokol ser ud ændrer ikke på mit tillægs-
 spørgsmål.
 
 Mvh
 Kent
 --
 Hard work may pay off in the long run, but laziness pays off right now.
 
 
 |  |  | 
                  Igor V. Rafienko (13-04-2006) 
 
	
          | |  | Kommentar Fra : Igor V. Rafienko
 | 
 Dato :  13-04-06 18:42
 | 
 |  | [ Kent Friis ]
 
 [ ... ]
 
 > > *Hvem* påstod noe slikt her?
 >
 > Alle de forslag der indtil videre er kommet med host byte order
 > (cast, memcpy) gav du indtryk af var ubrugelige.
 
 
 * "Alle de forslag der indtil videre er kommet" != "alle
 løsningsforslag på problem A".
 
 * Ingen påstod at problemet ikke kunne løses.
 
 [ ... ]
 
 
 > > Jeg venter kun på int-represntasjonen til OP. Dersom du vet hva
 > > han/hun ville, for all del, spesefiser det.
 >
 > Jeg ved det ikke, men jeg kunne stadig godt tænke mig at vide
 > hvordan du mener det bør gøres.
 
 
 En gang til, siden det var uklart den første gangen: jeg venter kun på
 int-representasjonen til OP. Dersom du vet hva han/hun ville, for all
 del, spesifiser det.
 
 *Med mindre* en slik spesifikasjon foreligger, er det umulig å svare
 på spørsmålet.
 
 Ser du /nå/ hva som mangler?
 
 [ ... ]
 
 
 > Viden om hvordan OP's protokol ser ud ændrer ikke på mit tillægs-
 > spørgsmål.
 
 
 Stemmer. Og det mangler fortsatt en liten bit, hvis jeg skal kunne
 foreslå noe kode. Hva er det som mangler?
 
 
 
 
 
 ivr
 --
 "...but it's HDTV -- it's got a better resolution than the real world."
 -- Fry, "When aliens attack"
 
 
 |  |  | 
                   Kent Friis (13-04-2006) 
 
	
          | |  | Kommentar Fra : Kent Friis
 | 
 Dato :  13-04-06 18:49
 | 
 |  | Den 13 Apr 2006 19:42:18 +0200 skrev Igor V. Rafienko:
 > [ Kent Friis ]
 >
 > [ ... ]
 >
 >> > *Hvem* påstod noe slikt her?
 >>
 >> Alle de forslag der indtil videre er kommet med host byte order
 >> (cast, memcpy) gav du indtryk af var ubrugelige.
 >
 >
 > * "Alle de forslag der indtil videre er kommet" != "alle
 >   løsningsforslag på problem A".
 
 Hvis løsningen ikke er blevet foreslået, er det ikke et løsnings-
 forslag.
 
 > * Ingen påstod at problemet ikke kunne løses.
 
 Nej, men vi har kun fået at vide "duer ikke". Vi venter stadig på dit
 forslag.
 
 >> > Jeg venter kun på int-represntasjonen til OP. Dersom du vet hva
 >> > han/hun ville, for all del, spesefiser det.
 >>
 >> Jeg ved det ikke, men jeg kunne stadig godt tænke mig at vide
 >> hvordan du mener det bør gøres.
 >
 >
 > En gang til, siden det var uklart den første gangen: jeg venter kun på
 > int-representasjonen til OP. Dersom du vet hva han/hun ville, for all
 > del, spesifiser det.
 >
 > *Med mindre* en slik spesifikasjon foreligger, er det umulig å svare
 > på spørsmålet.
 >
 > Ser du /nå/ hva som mangler?
 
 Nej, jeg ser at du stadig kun ønsker at svare på OP's spørsmål, og ikke
 mit.
 
 Så jeg opgiver her.
 
 Mvh
 Kent
 --
 Hard work may pay off in the long run, but laziness pays off right now.
 
 
 |  |  | 
                    Igor V. Rafienko (13-04-2006) 
 
	
          | |  | Kommentar Fra : Igor V. Rafienko
 | 
 Dato :  13-04-06 19:05
 | 
 |  | [ Kent Friis ]
 
 [ ... ]
 
 > > * "Alle de forslag der indtil videre er kommet" != "alle
 > >   løsningsforslag på problem A".
 >
 > Hvis løsningen ikke er blevet foreslået, er det ikke et løsnings-
 > forslag.
 
 
 "alle løsninger som er foreslått" != "alle løsninger". Fremdeles. Ikke
 vanskelig, ikke sant?
 
 
 > > * Ingen påstod at problemet ikke kunne løses.
 >
 > Nej, men vi har kun fået at vide "duer ikke". Vi venter stadig på
 > dit forslag.
 
 
 Og jeg venter stadig vekk på spesifikasjonen av det som skal løses.
 
 [ ... ]
 
 
 > > Ser du /nå/ hva som mangler?
 >
 > Nej, jeg ser at du stadig kun ønsker at svare på OP's spørsmål, og
 > ikke mit.
 
 
 Jeg venter på spesifikasjonen, fremdeles. Jeg gir i grunn blaffen i
 hvem som kommer med den.
 
 La oss ta dette nok en gang: den opprinnelige problemstillingen er
 *altfor* vag for å kunne besvares. Jeg har protestert på "forslagene"
 sendt hittil, nettopp fordi de ikke vil virke (i teori og praksis) i
 en rekke realistiske scenarioer.
 
 Så vil du se løsningsforslaget mitt. Greit nok. Men først må det være
 en problemstilling til det løsningsforslaget! Så, hvordan *er* int'en
 representert i det char-arrayet?
 
 
 > Så jeg opgiver her.
 
 
 Herregud, dette er som i et klassisk russisk eventyr: kongen sender en
 uønsket undersått "dit jeg ikke vet hvor er, og hent det jeg ikke vet
 hva er". Hvis du vil gi opp, framfor å spesifisere oppgaven, da kan du
 umulig forvente at jeg skal *gjette* på egenhånd hva *du* vil jeg skal
 løse? Hallo!
 
 
 
 
 
 ivr
 --
 "...but it's HDTV -- it's got a better resolution than the real world."
 -- Fry, "When aliens attack"
 
 
 |  |  | 
                     Kent Friis (13-04-2006) 
 
	
          | |  | Kommentar Fra : Kent Friis
 | 
 Dato :  13-04-06 19:31
 | 
 |  | Den 13 Apr 2006 20:04:46 +0200 skrev Igor V. Rafienko:
 > [ Kent Friis ]
 >
 > [ ... ]
 >
 >> > * "Alle de forslag der indtil videre er kommet" != "alle
 >> >   løsningsforslag på problem A".
 >>
 >> Hvis løsningen ikke er blevet foreslået, er det ikke et løsnings-
 >> forslag.
 >
 >
 > "alle løsninger som er foreslått" != "alle løsninger". Fremdeles. Ikke
 > vanskelig, ikke sant?
 
 Derfor skrev jeg jo også netop løsnings-forslag, og ikke løsninger.
 
 > Jeg venter på spesifikasjonen, fremdeles. Jeg gir i grunn blaffen i
 > hvem som kommer med den.
 
 Du *skrev* "OP's specifikation".
 
 >> Så jeg opgiver her.
 >
 > Herregud, dette er som i et klassisk russisk eventyr: kongen sender en
 > uønsket undersått "dit jeg ikke vet hvor er, og hent det jeg ikke vet
 > hva er".
 
 Tænk, sådan har jeg følt det de sidste mange gange du har skrevet det
 ikke er godt nok, uden at fortælle hvad det er du savner.
 
 Mvh
 Kent
 --
 Hard work may pay off in the long run, but laziness pays off right now.
 
 
 |  |  | 
                Anders J. Munch (13-04-2006) 
 
	
          | |  | Kommentar Fra : Anders J. Munch
 | 
 Dato :  13-04-06 13:04
 | 
 |  | Kent Friis wrote:
 > Den 12 Apr 2006 21:10:40 +0200 skrev Igor V. Rafienko:
 >> [...]
 > Men det du svarede på var en påstand om at memcpy var en brugbar
 > løsning ved host byte order. Og det er her uenigheden opstår, når
 > du siger memcpy ikke duer.
 
 memcpy duer fint til hvad den nu gør. Det er begrebet "host byte order"
 der ikke duer. Det er simpelthen ikke en nyttig abstraktion for den
 praktiske programmør. Det er en unødvendig modalitet.
 
 Det ses for eksempel når man prøver at skrive en unit test.
 
 En unittest for en little-endian indkodningsfunktion:
 vector<unsigned char> indkod_uint32_le(unsigned long);
 
 kunne se ud noget i den her stil:
 {
 unsigned char forv[4] = {1,2,3,4};
 assertEqual(indkod_uint32_le(0x04030201UL),
 vector<unsigned char>(forv+sizeof(forv)));
 }
 
 Ret ligetil, ikke sandt? Prøv nu at skrive en unittest for den
 tilsvarende "host byte order" funktion:
 
 vector<unsigned char> indkod_uint32_host(unsigned long);
 {
 vector<unsigned char> forv = indkod_uint32_host(0x04030201UL);
 ???
 }
 
 mvh. Anders
 
 
 |  |  | 
                Arne Vajhøj (14-04-2006) 
 
	
          | |  | Kommentar Fra : Arne Vajhøj
 | 
 Dato :  14-04-06 03:44
 | 
 |  | Kent Friis wrote:
 > Blandt typiske Windows-udviklere, er de stadig i host byte order. Derfor
 > kan du ikke antage hverken det ene eller det andet.
 
 Jeg checkede lige i .NET docs:
 
 System.IO.BinaryReader ReadInt32 bruger altid little endian.
 
 System.BitConverter ToInt32 bruger host endianess.
 
 (relevant for mono som kører på Linux og diverse BSD varianter
 på både x86 og PPC)
 
 Arne
 
 
 |  |  | 
             Arne Vajhøj (14-04-2006) 
 
	
          | |  | Kommentar Fra : Arne Vajhøj
 | 
 Dato :  14-04-06 02:50
 | 
 |  | Igor V. Rafienko wrote:
 > [ Arne Vajhøj ]
 >> Men kun 2-3 indlæg siden du mente at kunne modbevise påstanden om de
 >> fleste computere med at dit Solaris eksempel - hvilket jo enten var
 >> totalt irrelevant eller måtte være baseret på en antagelse om at
 >> Solaris/SPARC er mere udbredt end Windows/x86.
 >
 > Huh?
 
 Jeg skrev:
 
 #Det virker så tilfældigvis på det store flertal af computere.
 
 Du svarede:
 
 #Right. Omtrent som i eksempelet mitt.
 
 Hvis du mener at din kørsel modbeviser påstanden om
 at det tilfældigvis virker på det store flertal af computere,
 så må du vel mene at din kørsel er sket på et system
 som repræsenterer flertallet af computere.
 
 Ellers kan jeg ikke se logikken.
 
 > For det andre, så har jeg aldri nevnt SPARC. *Du* har begynt å gnåle
 > om det. Jeg har ikke tenkt å stå for *dine* utsagn, det må du klare på
 > egenhånd.
 
 Din kørsel antyder ret kraftigt at det var en SPARC det var
 kørt på.
 
 > La meg legge frem en dårlig forenkling: på en elendighetsskala fra 0
 > til 10, der 10 betyr "virker" og alt under "5" er en klar kandidat til
 > dailywtf, kan man trygt spre forslagene slik:
 >
 >       0                                    10
 >  rå typecast     memcpy       manuell sammensetting av tallet
 >
 > memcpy _er_ et skritt i riktig retning, men det skrittet er ikke langt
 > nok. Vil du ha forklart _en gang til_ hvorfor?
 
 memcpy virker
 
 Der er ovenikøbet den som gør det spørger tror at typecast
 hacket gør (og som det også tilfældigvis gør på en forfærdelig
 masse computere).
 
 Er en protokol med fixed endianess en god ting ?
 
 Ja det er det ofte. Men det er ikke altid muligt fordi der
 er andre system/subsystemer man ikke kan ændre. Men det er system
 design og ikke C programmering.
 
 Arne
 
 
 |  |  | 
              Igor V. Rafienko (18-04-2006) 
 
	
          | |  | Kommentar Fra : Igor V. Rafienko
 | 
 Dato :  18-04-06 21:48
 | 
 |  | [ Arne Vajhøj ]
 
 [ ... ]
 
 > memcpy virker
 
 
 Ja, riktig. Omtrent som eksempelet mitt.
 
 
 > Der er ovenikøbet den som gør det spørger tror at typecast hacket
 > gør (og som det også tilfældigvis gør på en forfærdelig masse
 > computere).
 
 
 Høres ut som argumentasjon til de som designer vevsidene sine
 utelukkende for MSIE.
 
 
 > Er en protokol med fixed endianess en god ting ?
 
 
 Det er ikke det som er poenget (d'uh!)
 
 
 > Ja det er det ofte. Men det er ikke altid muligt fordi der er andre
 > system/subsystemer man ikke kan ændre. Men det er system design og
 > ikke C programmering.
 
 
 Det er bare fjas, nok en gang. Formatet på data man leser inn er gitt.
 (hvis ikke kan jo ikke programmet tolke dataene). Det spiller iofs.
 ingen rolle om data er i little/big endian eller pakket på en annen
 måte. Alt man *trenger* å vite *før* man skal prøve å løse oppgaven er
 formatbeskrivelsen. Get it now?
 
 [ ... ]
 
 
 
 
 
 ivr
 --
 "...but it's HDTV -- it's got a better resolution than the real world."
 -- Fry, "When aliens attack"
 
 
 |  |  | 
          Anders J. Munch (11-04-2006) 
 
	
          | |  | Kommentar Fra : Anders J. Munch
 | 
 Dato :  11-04-06 18:35
 | 
 |  | Arne Vajhøj wrote:
 > Jeg finder det lidt grotesk at man i en diskussion om portabilitet
 > uden at blinke foreslår at man ændrer koden fra host endianess til
 > fixed endianess.
 
 Jeg finder det ganske naturligt, for det kan kun være en forbedring.
 
 Enten er de pågældende data genereret af programmet selv under samme
 kørsel, og så er det flintrende ligegyldigt hvordan man gør, når bare
 man gør det samme begge veje, og det er indenfor defined behaviour.
 Eller også skal det bruges til at kommunikere med verden omkring sig, fx
 gennem filformater eller netværksprotokoller - og så er det en god idé
 at have et fuldt specificeret format.
 
 mvh. Anders
 
 
 |  |  | 
           Arne Vajhøj (12-04-2006) 
 
	
          | |  | Kommentar Fra : Arne Vajhøj
 | 
 Dato :  12-04-06 02:25
 | 
 |  | Anders J. Munch wrote:
 > Arne Vajhøj wrote:
 >> Jeg finder det lidt grotesk at man i en diskussion om portabilitet
 >> uden at blinke foreslår at man ændrer koden fra host endianess til
 >> fixed endianess.
 >
 > Jeg finder det ganske naturligt, for det kan kun være en forbedring.
 >
 > Enten er de pågældende data genereret af programmet selv under samme
 > kørsel, og så er det flintrende ligegyldigt hvordan man gør, når bare
 > man gør det samme begge veje, og det er indenfor defined behaviour.
 > Eller også skal det bruges til at kommunikere med verden omkring sig, fx
 > gennem filformater eller netværksprotokoller - og så er det en god idé
 > at have et fuldt specificeret format.
 
 Der er masser af gode grunde til at ligge sig fast på en
 endianess.
 
 Men hvis man foreslår det skal man gøre opmærksom på det.
 
 "... når bare man gør det samme begge veje" er jo åbenlyst rigtigt,
 men ikke nødvendigvis opfyldt.
 
 Arne
 
 
 |  |  | 
  Bertel Brander (08-04-2006) 
 
	
          | |  | Kommentar Fra : Bertel Brander
 | 
 Dato :  08-04-06 00:31
 | 
 |  | 
 
            Jan Thogersen wrote:
 > Hej,
 > 
 > Jeg sidder her med et lille problem... jeg har gjort det gør men kan 
 > simpelthen ikke huske hvordan.
 > 
 > Jeg har en buffer:
 > 
 > unsigned char _FF_Buf[512];
 > 
 > Nu vil jeg så gerne fange nogle unsigned int's fra den buffer. Og det 
 > kan gøres med type casts jeg kan bare ikke huske syntaxen.
 > 
 > MyInt = (unsigned int) _FF_Buf+index;
 #include <iostream>
 unsigned char Buf[512] = {0x12, 0x34, 0x56, 0x78, 0x11, 0x22, 0x33, 
 0x44, 0x55};
 int main()
 {
     unsigned int MyInt = *(unsigned int *)(Buf + 4);
     std::cout << "The result seems to be: " << MyInt << std::endl;
 }
 Husk på at der er tale om "undefined behaviour", "so be carefull
 out there"
 I C++ er der en hel række cast "operatorer", men jeg kan ikke huske
 om der er en der vil være bedre at bruge her, og der vil vist
 stadig være tale om "undefined behaviour".
 -- 
 Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard But it's mine - Bertel
            
             |  |  | 
  Anders J. Munch (08-04-2006) 
 
	
          | |  | Kommentar Fra : Anders J. Munch
 | 
 Dato :  08-04-06 15:49
 | 
 |  | Jan Thogersen wrote:
 > Hej,
 >
 > Jeg sidder her med et lille problem... jeg har gjort det gør men kan
 > simpelthen ikke huske hvordan.
 >
 > Jeg har en buffer:
 >
 > unsigned char _FF_Buf[512];
 >
 > Nu vil jeg så gerne fange nogle unsigned int's fra den buffer. Og det
 > kan gøres med type casts jeg kan bare ikke huske syntaxen.
 >
 > MyInt = (unsigned int) _FF_Buf+index;
 
 Der er ingen grund til at bruge casts til sådan noget.
 
 Prøv enten:
 /* Data i _FF_Buf er i netværksformat/big-endian */
 MyInt = _FF_Buf[index] * 256u + _FF_Buf[index+1];
 eller
 /* Data i _FF_Buf er i little-endian format */
 MyInt = _FF_Buf[index] + _FF_Buf[index+1] * 256u;
 
 mvh. Anders
 
 PS: Navne der begynder med _ fulgt af et stort bogstav er reserveret for
 implementationen, så du bør nok kalde _FF_Buf noget andet.
 
 
 |  |  | 
  Arne Vajhøj (08-04-2006) 
 
	
          | |  | Kommentar Fra : Arne Vajhøj
 | 
 Dato :  08-04-06 16:54
 | 
 |  | Anders J. Munch wrote:
 > Jan Thogersen wrote:
 >> Jeg har en buffer:
 >>
 >> unsigned char _FF_Buf[512];
 >>
 >> Nu vil jeg så gerne fange nogle unsigned int's fra den buffer. Og det
 >> kan gøres med type casts jeg kan bare ikke huske syntaxen.
 >>
 >> MyInt = (unsigned int) _FF_Buf+index;
 >
 > Der er ingen grund til at bruge casts til sådan noget.
 >
 > Prøv enten:
 >   /* Data i _FF_Buf er i netværksformat/big-endian */
 >   MyInt = _FF_Buf[index] * 256u + _FF_Buf[index+1];
 > eller
 >   /* Data i _FF_Buf er i little-endian format */
 >   MyInt = _FF_Buf[index] + _FF_Buf[index+1] * 256u;
 
 Eller shift fremfor gange.
 
 Man skal bare gøre sig klart at de 2 stykker kode
 grundliggende er forskellige:
 
 1)  der genereres formentligt forskellige maskin instruktioner
 for dem
 
 2)  de opfører sig forskelligt ved flytning af koden mellem
 little endian og big endian maskiner
 
 Om det betyder noget for spørger ved jeg ikke.
 
 Arne
 
 
 |  |  | 
 |  |