Avatar billede nka Nybegynder
05. december 2002 - 12:12 Der er 13 kommentarer og
3 løsninger

Datatype i C

Hej

Jeg er bekendt med at der findes i data type i C++ der hedder byte. Findes der ikke en tilsvarende i C (det er GNU C Library jeg bruger.

På forhånd tak.
Avatar billede jpk Nybegynder
05. december 2002 - 12:18 #1
Du kan prøve med BYTE, char eller unsigned char
Avatar billede arne_v Ekspert
05. december 2002 - 12:26 #2
Der er uden tvivl char du skal bruge.

PS: jeg er absolut ikke overbevist om at ANSI C++
    har en byte (Java har og C# har vistnok også).
Avatar billede dittmer Nybegynder
05. december 2002 - 12:34 #3
Det er ikke sikkert, at dette er det, du søger...

"Standard C defines three 'character' types - char, signed char, and unsigned char. All of these types must be able to represent all the characters in the execution character set. All are representet by at least eight bits."

De datatyper vi kender i C er som regel specificeret som "mindst X bit" - og heldigt for os, for ellers ville vi nok være bundet fast til en 16-bit integer...

Så svaret er nej, der findes ikke en type, der hedder byte i C. Men du kan jo godt bruge en integer til at repræsentere tingene i. Og en byte er osse sådan en kedelig størrelse, 1 byte. Der er ikke nogen maskiner, der kan addressere kun 1 byte. De bruger et "ord", hvilket for de fleste maskiner i dag er 32 bit. At addressere mindre pr. access ville give et alvorligt performance-hit. Brug en integer og mask eventuelt det overskydende ud...
Avatar billede arne_v Ekspert
05. december 2002 - 12:40 #4
dittmer>

så godt som alle computere idag adresserer bytes
(hver byte har sin egen adresse). Men mange
computere vælger at hente mere end en byte ad gangen
af performance hensyn.

Hvis man går lidt tilbage i tiden, så kan man
godt finde computere, hvor man decideret adresserede
ord og ikke bytes.
Avatar billede jpk Nybegynder
05. december 2002 - 12:42 #5
dittmer >> nu er det jo ikke sikkert at han kun skal tildele en værdi til én variabel, men måske fx læse data ind i et array. Så ville det ikke give mening med en int...

En typisk måde at håndtere det på er:

typedef unsigned char BYTE;

og så bruge BYTE...
Avatar billede nka Nybegynder
05. december 2002 - 12:51 #6
OK, tak for hjælpen indtil nu, men det løser ikke heæt mit problem.
Grunden til at spørger er at jeg skal gemme et billede i en i en buffer i C
Billedet ser således ud hvis man bare lister det:
--------------------------------------------------------------------
GIF89aX▼ã öÃ
            GØ6d«T|║▀µ‗¯¯¯LLL«««ØØØ¥¥¥▒├ÓíÀ┘ƽË,,,}}}∟∟∟¯‗°!Uª┴¤µììì


                                                                    ↨Módê┴
                                                                          DØĺÊ╬
]]ð&#9608;ý&Y¿â&#402;&#9552;Ep&#9508;<<<lzæmmm&#9568;&#9568;&#9568;fcÑãfÖ{¡Jö¢þ´¸JJJ¢¢ãÖÖÖÁÍþäÁÍ333äää#&#8735;
                                                              &#9824;Z£¢fff´&#9488;_ëm6<0mW
+&#9600;&#9619;Y»îFL<&#9650;&#9492;ÖL¤ÑR[H$,#
                        &#9830;£|>1îÁ999&#8735;&#9644;
                                    &#9500;£NÙ&#9565;^Öf3¶&#9500;aò&#9568;Ö3&#9571;öJß&#9508;ZÌ&#9618;X{sf( &#9658;fÖfÖfÖfÖfÖfÖf
ÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖfÖ!
&#9632;Valid CSS!!¨&#9830;&#9786;&#8962;,X&#9660;&#9632;Ç$éâäàåçêëèïîà&#8962;ÅÅ$ôöòûùÿÖ%ø£Ø×&#402;áíáGF+ÉæÖ®¬®ó¡«»%ñªºÆ½ÂÂ&#9617;&#9571;&#9553;&#9618;Ñ
ÁÀ&#9524;ÿ&#9559;&#9472;¡&#9619;¥&#9492;&#9516;&#9577;ô&#9532;&#9552;&#402;Ã&#9508;&#9574;Ê&#9580;&#305;øðÉÁ&#9786;&#9787;&#9829;ö&#9830;&#9787;&#9830;ò&#9787;õÕõô&#9824;
                                        öÍ&#305;Ï¿
                                            õô
µÕ¦&#9824;&#8735;!&#9787;&#9830;x±Ü&#9552;¹Eë&#8735;âI&#8597;&#9562;-­&`&#9787;                      þö
                        &#9608;&#9830;PPßüà&#9829;&#9824;&@ÿÉÏB`&#9600;&#9516;M&#9553; C&#9500;
ô8D¿T&#9619;ÏIJ·.LÛ@&#9580;&#9500;${&#9787;$°poÊâ                      H`®Êüà
                        ö
                          &#9565;#iÒ&#9824;Ľ9tp&#9484;&#9524;Ò*Å&#9650;£|³­&#9553;CÎ1$&#9496;(ì0æ)&#9571;&#9632;0p&#9829;&#9617;÷&#9829;Ñ&#9824;Xò&#9617;&#9786;d`&#9600;A&#9508;÷&#9830;Ã@
&#9617;:é6³@H.RIÉHª7iÇÇ,&#9474;l&#9492;â&#9580;&#9600;&#9830;x&#9492;ü¬M7¹Ïk°GëÈA&#9577;Zu£·&#9524;ì&#8597;;p8åuõåõ&#9600;
                                                        )1§&#9658;±27ó&#9787;Óé0À1&#9472;Ú&#8597;<&#9650;õÁc ß
6J°&#9617;>ÉÃjX¥&#8962;å£ÚÇ&#9553;ó+Q`    éÒ¾&#9660;Ê9§©ßÏÃì&#8735;8èt/íÒãÏ&#9488;@&#9492;"äx&#9492;%&#9829;K,&#9496;e&#8595;9.U"WR8Ú%&#9830;`§§5ØaËA¸»=
@ü[ÝE§Ú<p&#9658;3=m&#9516;DëHýë&#9472;,DVÊÅRÇO&#9786;,Ö&#9829;&#8616;&#9787;D&#9658;&#9516;@ª&#9496;YÆÑ%6ü)ej®&#9830;Q7GàµAá &#9658;Ê&#9829;&#8735;õÑÛ¬öèþD/fZÔªZûHW
Wl±&#9532;g³0Q°!¨&#9830;&#9786;´¥³÷Ù´&#9488;!­&#9492;&#9830;&#8616;l­&#9660;&#8735;&#9829;¶ÔÆ&#9617;&#9516;&#9500;&#9658;G,±&#9472;¶{¯
            &#8962;,&#9786;&#9786;$&#8735;&#9632;ÇéâäàåçêëèïîìÄÅÉæÆôöê&#9786;&#9787;&#9829;â&#9830;&#9787;&#9830;ä&#9787;áíáé&#9824;
                                                        à
                                                        áé
óíÖ&#9824;&#9553;&#9658;&#9658;åá                                                  úâ
        é&#8597;á
            Ü&#9787;¶¶ù&#9787;¶§&#9644;&#9553;  åøØé&#8616;&#9787;â&#9787;&#8595;&#8597;&#9484;Ï&#9644;éç&#9618;&#8616;é&#8596;á&#9650;é¡&#9787;&#8597;&#9660;«é§â&#9824;½å&#402;&#9787;è¦&#9829;&#305;&#9786;&#9824;L~¶&#9492;@ú&#9786;&#9787;&#9787;Ç¿¡&#9786;&#9787;,
n&#8597;Óí&#8595;įy&#9644;Ë;&#9786;Aêj&#9644;&#9516;Ð&#9556;{&#9829;¶r$DAgÅ&#9508;i¶7BÚØs¶¶%Çe&#9786;
                                          &#9532;b&#9824;i^;'Z*&#9516;P?D$&#8962;&#9787;wÈ&#9500;+âá&#8597;T#&#9472;aDóM&#9532;&#9830;&#8596;
                                                                          ªràü<
7#ý&#9829;PÛü/D&#9508;Û&#9524;&#8597;­¬Ç6Q<ê&#9658;B&#8616;&#9562;D&#9617;      &#9574;$oúç&#9508;&#9658;L{&#9492;&#9524;íó»â0
                                                +X®&#9474;þ¤áCï;
--------------------------------------------------------------------

Sådan som jeg gør nu er
#define BUFLEN          32768  /* maximum response size      */

char                buffer[BUFLEN+1]; /* buffer server answer    */
char*              ptr;              /* pointer into the buffer  */
ptr = response;

Derefter laver jeg en read til ptr;

problemet liger i at jeg kun for "GIF89aX" over i min buffer.
Jeg troede derfor at jeg ikke kunne gemme "mærkelige" tegn i en char.
Er det så ikke korrekt og hvad kan jeg ellers gøre.
Jeg ved godt at det måske er et lidt andet spørgsmål en jeg startede med at stille, men jeg skal nok sætte pointene op eller oprette et nyt spørgsmål hvis det behøves.

På forhånd tak.
Avatar billede nka Nybegynder
05. december 2002 - 12:54 #7
Jeg kan se at der er kommet et "&" efter "GIF89aX", men på min command prompt er det et glad ansigt, eller et hjerte eller noget i den dur.
Avatar billede jpk Nybegynder
05. december 2002 - 12:58 #8
en char indeholder IKKE egentlig et tegn, men en værdi mellem -128 og 127
en unsigned char indeholder en værdi mellem 0 og 255

Den kan derfor godt indeholde "mærkelige" tegn, sålænge de er defineret i det tilladte interval...
Avatar billede nka Nybegynder
05. december 2002 - 12:59 #9
det er sføli
ptr = buffer;
Avatar billede dittmer Nybegynder
05. december 2002 - 12:59 #10
arne> Det er rigtigt, at der kan adresseres i bytes, men der hentes stadig et ord ad gangen. Der er derfor ikke nogen performancemæssig (mht. overførsel) grund til at bruge byte.

jpk> Du kan jo kalde din nye type hvad som helst, men en gylden regel er, at du ikke skal kalde den noget, den ikke er (ok, det var lidt flabet, men jeg tror, det går...  ;o). Jeg ved godt, at en BYTE og en byte ikke er det samme, men de minder da en del om hinanden i navnet, ikke?

Jeg glemte at sige i citatet ovenfor, at det var fra Plaugers bog om standard-C-biblioteket. Du "risikerer" derfor at stå med en BYTE, som faktisk fylder 16 bits (hvilket vil overraske mange) på et system, der benytter Unicode. Bevares, en byte er ikke oprindeligt defineret som otte bit. Det er (oprindeligt) defineret som den mindste enhed, der kan adresseres på maskinen, og har gennem tiderne været både sekd, syv og otte bit. Den nuværende brug af ordet beror på en antagelse om at en byte indeholder otte bit.

Det er bare ret sjældent efterhånden, det er nødvendigt at spekulere på om et tegn ligger i 8 eller 16 bit, og som oftest er det netop sådanne antagelser, der giver anledning til de store fejl og in-portabilitet... Derfor er det altid min anbefaling til programmørerne, at de holder sig til typer, der ikke forventes at være af en specifik størrelse...

Nå, nu tog det vist overhånd igen...
Avatar billede jpk Nybegynder
05. december 2002 - 13:00 #11
read stopper sansynligvis ved bestemte karakterer, hvilket giver dig problemet...

du kan prøve at lave en ZeroMemory på dit char array først, for at få nulstillet det
Avatar billede chries Nybegynder
05. december 2002 - 13:02 #12
husker du at åbne filen i "binary mode" ?
Avatar billede nka Nybegynder
05. december 2002 - 13:09 #13
ok, der er da en del jeg kan prøve, jeg glemte måske lige at sige at jeg bruger read til at læse fra en socket.
Avatar billede jpk Nybegynder
05. december 2002 - 13:10 #14
returnerer read ikke hvor mange tegn/bytes der blev læst?
Det kunne du også kigge på...
Avatar billede arne_v Ekspert
05. december 2002 - 14:16 #15
dittmer> din pointe om at bruge en int er udmærket
så længde det er simple variabel, hvis det er arrays så ...
Avatar billede nka Nybegynder
07. december 2002 - 17:23 #16
Det virkede med en unsigned char buffer[] så længe det er arrayet og ikke en pointer til arrayet til tilføjet til min recv(socket_descriptor, buffer, buffer_size);

Tak for hjælpen
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