/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
Little endian
Fra : Jacob Jensen


Dato : 17-08-06 06:48

Ivan Johansen nævnte i forbindelse med mine sidste par tråde om DirectX at
jeg måske skulle tage højde for "little endian" format.

Det viste sig at i wave-filen som jeg parsede var alle tallene i headeren
faktisk angivet i little endian (For et 32 bit 32 kom først byte 0, så byte
1, så byte 2 og så byte 3). Alle strenge var i big endian (F.eks. står der
strenge som "riff", "fmt " og "data" med tegnene angivet i den viste
rækkefølge.

Jeg benytter fread() i mit program til at læse fra filen. Jeg er faktisk
lidt i tvivl om hvordan det virker.

Hvis jeg skriver:
fread(id, sizeof(BYTE), 4, fp);

Så indeholder id den korrekte streng. Altså er der kopieret byte-for-byte
fra filen over til id.

Hvis jeg skriver:
fread(&noget, sizeof(DWORD), 1, fp);

Så inderholder size nu et 32-bit tal men dette må være blevet konverteret
fra little endian til big endian.

Finder fread selv ud af det? Hvordan i så fald? Hvis ikke, hvorfor virker
det så?

--
Jacob Jensen
E-mail: jacob@etlivmedsle.dk
Hjemmeside: www.etlivmedsle.dk



 
 
Ivan Johansen (17-08-2006)
Kommentar
Fra : Ivan Johansen


Dato : 17-08-06 08:14

Jacob Jensen wrote:
> Hvis jeg skriver:
> fread(&noget, sizeof(DWORD), 1, fp);
>
> Så inderholder size nu et 32-bit tal men dette må være blevet konverteret
> fra little endian til big endian.
>
> Finder fread selv ud af det? Hvordan i så fald? Hvis ikke, hvorfor virker
> det så?

En PC-processor er en little endian processor. Det vil sige at hvis du
har noget kode som:
unsigned test = 0x12345678;
så vil det i RAM blive gemt som 0x78 0x56 0x34 0x12

Det er dog sjældent noget man tænker over. Det er normalt kun relevant
ved kommunikation med andre systemer, f.eks. gennem filer eller over
netværk.

fread() kopierer data direkte fra filen til RAM uden nogen konvertering.
I dette tilfælde ligger data som little endian i filen og processoren
forventer det på samme måde i RAM, så der er ikke brug for nogen
konvertering.

Ivan Johansen

Jacob Jensen (17-08-2006)
Kommentar
Fra : Jacob Jensen


Dato : 17-08-06 15:31

> En PC-processor er en little endian processor. Det vil sige at hvis du har
> noget kode som:
> unsigned test = 0x12345678;
> så vil det i RAM blive gemt som 0x78 0x56 0x34 0x12

Hvor 0x12 altså ligger i hukommelsescellen med den højste adresse?

<klip>

Endnu engang tak.

Jacob



Bertel Brander (17-08-2006)
Kommentar
Fra : Bertel Brander


Dato : 17-08-06 19:03

Jacob Jensen wrote:
>> En PC-processor er en little endian processor. Det vil sige at hvis du har
>> noget kode som:
>> unsigned test = 0x12345678;
>> så vil det i RAM blive gemt som 0x78 0x56 0x34 0x12
>
> Hvor 0x12 altså ligger i hukommelsescellen med den højste adresse?

Lad os se:

#include <iostream>

int main()
{
unsigned test = 0x12345678;
unsigned char *p = (unsigned char *)&test;
std::cout << std::hex << (unsigned int )p[0] << " " << (unsigned int
)p[1] << " " << (unsigned int )p[2] << " " << (unsigned int )p[3] <<
std::endl;
}

Dette skriver:
78 56 34 12
På min Intel PC, der er little endian.

Så ja, 0x12 står på den højeste adresse.

Eller man kan sige at det der står på den første byte
i ordet er LSB deraf little endian.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Kent Friis (17-08-2006)
Kommentar
Fra : Kent Friis


Dato : 17-08-06 19:10

Den Thu, 17 Aug 2006 20:03:26 +0200 skrev Bertel Brander:
> Jacob Jensen wrote:
>>> En PC-processor er en little endian processor. Det vil sige at hvis du har
>>> noget kode som:
>>> unsigned test = 0x12345678;
>>> så vil det i RAM blive gemt som 0x78 0x56 0x34 0x12
>>
>> Hvor 0x12 altså ligger i hukommelsescellen med den højste adresse?
>
> Lad os se:
>
> #include <iostream>
>
> int main()
> {
> unsigned test = 0x12345678;
> unsigned char *p = (unsigned char *)&test;
> std::cout << std::hex << (unsigned int )p[0] << " " << (unsigned int
> )p[1] << " " << (unsigned int )p[2] << " " << (unsigned int )p[3] <<
> std::endl;
> }
>
> Dette skriver:
> 78 56 34 12
> På min Intel PC, der er little endian.
>
> Så ja, 0x12 står på den højeste adresse.
>
> Eller man kan sige at det der står på den første byte
> i ordet er LSB deraf little endian.

Little end (ian) = den lille ende kommer først. Altså enerne står først.
I modsætning til når vi skriver det, hvor det er den store ende
(millionerne) der kommer først (big end (ian)).

En million = 1.000.000 = big endian.
En million = 000.000.1 = little endian.

(Systemet er det samme uanset om vi snakker om titalssystemet eller
binært).

Mvh
Kent
--
"So there I was surrounded by all these scary creatures
They were even scarier than what Microsoft call features"
- C64Mafia: Forbidden Forest (Don't Go Walking Slow).

Bertel Brander (17-08-2006)
Kommentar
Fra : Bertel Brander


Dato : 17-08-06 19:22

Kent Friis wrote:
> Den Thu, 17 Aug 2006 20:03:26 +0200 skrev Bertel Brander:
>> Jacob Jensen wrote:
>>>> En PC-processor er en little endian processor. Det vil sige at hvis du har
>>>> noget kode som:
>>>> unsigned test = 0x12345678;
>>>> så vil det i RAM blive gemt som 0x78 0x56 0x34 0x12
>>> Hvor 0x12 altså ligger i hukommelsescellen med den højste adresse?
>> Lad os se:
>>
>> #include <iostream>
>>
>> int main()
>> {
>> unsigned test = 0x12345678;
>> unsigned char *p = (unsigned char *)&test;
>> std::cout << std::hex << (unsigned int )p[0] << " " << (unsigned int
>> )p[1] << " " << (unsigned int )p[2] << " " << (unsigned int )p[3] <<
>> std::endl;
>> }
>>
>> Dette skriver:
>> 78 56 34 12
>> På min Intel PC, der er little endian.
>>
>> Så ja, 0x12 står på den højeste adresse.
>>
>> Eller man kan sige at det der står på den første byte
>> i ordet er LSB deraf little endian.
>
> Little end (ian) = den lille ende kommer først. Altså enerne står først.
> I modsætning til når vi skriver det, hvor det er den store ende
> (millionerne) der kommer først (big end (ian)).
>
> En million = 1.000.000 = big endian.
> En million = 000.000.1 = little endian.
>
> (Systemet er det samme uanset om vi snakker om titalssystemet eller
> binært).

Ja, der er dog ingen garanti for at maskinen er det ene
eller det andet, man kan godt have maskiner der ville
skrive:
56 78 12 34
Eller maskinen kunne have 32 bit char, hvorfor det ikke
giver mening at snakke om endianes.

--
Absolutely not the best homepage on the net:
http://home20.inet.tele.dk/midgaard
But it's mine - Bertel

Kent Friis (17-08-2006)
Kommentar
Fra : Kent Friis


Dato : 17-08-06 19:55

Den Thu, 17 Aug 2006 20:21:30 +0200 skrev Bertel Brander:
> Kent Friis wrote:
>> Den Thu, 17 Aug 2006 20:03:26 +0200 skrev Bertel Brander:
>>> Jacob Jensen wrote:
>>>>> En PC-processor er en little endian processor. Det vil sige at hvis du har
>>>>> noget kode som:
>>>>> unsigned test = 0x12345678;
>>>>> så vil det i RAM blive gemt som 0x78 0x56 0x34 0x12
>>>> Hvor 0x12 altså ligger i hukommelsescellen med den højste adresse?
>>> Lad os se:
>>>
>>> #include <iostream>
>>>
>>> int main()
>>> {
>>> unsigned test = 0x12345678;
>>> unsigned char *p = (unsigned char *)&test;
>>> std::cout << std::hex << (unsigned int )p[0] << " " << (unsigned int
>>> )p[1] << " " << (unsigned int )p[2] << " " << (unsigned int )p[3] <<
>>> std::endl;
>>> }
>>>
>>> Dette skriver:
>>> 78 56 34 12
>>> På min Intel PC, der er little endian.
>>>
>>> Så ja, 0x12 står på den højeste adresse.
>>>
>>> Eller man kan sige at det der står på den første byte
>>> i ordet er LSB deraf little endian.
>>
>> Little end (ian) = den lille ende kommer først. Altså enerne står først.
>> I modsætning til når vi skriver det, hvor det er den store ende
>> (millionerne) der kommer først (big end (ian)).
>>
>> En million = 1.000.000 = big endian.
>> En million = 000.000.1 = little endian.
>>
>> (Systemet er det samme uanset om vi snakker om titalssystemet eller
>> binært).
>
> Ja, der er dog ingen garanti for at maskinen er det ene
> eller det andet, man kan godt have maskiner der ville
> skrive:
> 56 78 12 34

Em little endian 16-bit CPU der er blevet udvidet til at være
big-endian 32-bit?

Teoretisk muligt, men er der eksempler på det?

Mvh
Kent
--
"So there I was surrounded by all these scary creatures
They were even scarier than what Microsoft call features"
- C64Mafia: Forbidden Forest (Don't Go Walking Slow).

Jacob Jensen (17-08-2006)
Kommentar
Fra : Jacob Jensen


Dato : 17-08-06 22:10

>> Ja, der er dog ingen garanti for at maskinen er det ene
>> eller det andet, man kan godt have maskiner der ville
>> skrive:
>> 56 78 12 34
>
> Em little endian 16-bit CPU der er blevet udvidet til at være
> big-endian 32-bit?
>
> Teoretisk muligt, men er der eksempler på det?

Se bare på:
http://en.wikipedia.org/wiki/Endianness

....under "Middle-endian"

Jacob



Rasmus Neckelmann (01-09-2006)
Kommentar
Fra : Rasmus Neckelmann


Dato : 01-09-06 09:17

Jacob Jensen wrote:
> Det viste sig at i wave-filen som jeg parsede var alle tallene i
> headeren faktisk angivet i little endian (For et 32 bit 32 kom først
> byte 0, så byte 1, så byte 2 og så byte 3). Alle strenge var i big
> endian (F.eks. står der strenge som "riff", "fmt " og "data" med
> tegnene angivet i den viste rækkefølge.

Normalt siger man ikke big endian eller little endian om strenge - tegnene
kommer bare i den rækkefølge som de nu engang kommer i, og det er det samme
på alle normale (ikke-sindsyge) systemer som PPC, x86, osv. Siger ikke at
der ikke findes systemer der er anderledes :)

--
mvh Rasmus Neckelmann



Søg
Reklame
Statistik
Spørgsmål : 177428
Tips : 31962
Nyheder : 719565
Indlæg : 6407944
Brugere : 218877

Månedens bedste
Årets bedste
Sidste års bedste