---
title: "Förbättra big endian -> little endian loop"
type: "forum-thread"
url: "https://www.webforum.nu/amne/c-cpp/169418-förbättra-big-endian-little-endian-loop"
topic: "C/C++"
topic_url: "https://www.webforum.nu/amne/c-cpp"
author: "Danielkun"
published: "2008-02-28T03:19:01.000Z"
updated: "2008-02-29T21:28:36.000Z"
replies: 5
views: 880
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/c-cpp/169418-förbättra-big-endian-little-endian-loop"
---

# Förbättra big endian -> little endian loop

## #1 — Danielkun, 2008-02-28T03:19Z

Hej, jag använder mig av nedanstående loop för att konvertera 16 bit big endian till little endian.
Jag är fortfarande ny med C och jag undrar om det går det att förbättra denna loop?

```
&#12288;&#12288;while (0 < (readBytes = fread(rwBuf, 1, sizeof(rwBuf), srcFile))) {

&#12288;&#12288;&#12288;&#12288;// swap 16bit data
&#12288;&#12288;&#12288;&#12288;unsigned char c2;
&#12288;&#12288;&#12288;&#12288;for (int i = 0, n = readBytes; i < n;) {
&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;c2 = rwBuf[i + 1];
&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;rwBuf[i + 1] = rwBuf[i];
&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;rwBuf[i] = c2;
&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;i += 2;
&#12288;&#12288;&#12288;&#12288;}

&#12288;&#12288;&#12288;&#12288;if (1 != fwrite(rwBuf, readBytes, 1, fp)) {
&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;printf("failed to fwrite().\n");
&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;return -1;
&#12288;&#12288;&#12288;&#12288;}
&#12288;&#12288;&#12288;&#12288;writeBytes += readBytes;
&#12288;&#12288;}
```

Permalänk: https://www.webforum.nu/p/169418

## #2 — spango, 2008-02-28T10:01Z

Ser väl rätt funkis ut, bortsett från att din loopvariabel, n, är onödig (du kan ju lika gärna använda readBytes). Sen skulle jag kanske om jag var du flytta in inkrementeringen av i upp till for-huvudet:

```
&#12288;&#12288;while (0 < (readBytes = fread(rwBuf, 1, sizeof(rwBuf), srcFile))) {
&#12288;&#12288;&#12288;&#12288;// swap 16bit data
&#12288;&#12288;&#12288;&#12288;unsigned char c2;
&#12288;&#12288;&#12288;&#12288;for (int i = 0; i < readBytes; i += 2) {
&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;c2 = rwBuf[i + 1];
&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;rwBuf[i + 1] = rwBuf[i];
&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;rwBuf[i] = c2;
&#12288;&#12288;&#12288;&#12288;}
&#12288;&#12288;&#12288;&#12288;if (1 != fwrite(rwBuf, readBytes, 1, fp)) {
&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;printf("failed to fwrite().\n");
&#12288;&#12288;&#12288;&#12288;&#12288;&#12288;return -1;
&#12288;&#12288;&#12288;&#12288;}
&#12288;&#12288;&#12288;&#12288;writeBytes += readBytes;
&#12288;&#12288;}
```

Permalänk: https://www.webforum.nu/p/2085352

## #3 — Danielkun, 2008-02-29T03:47Z

spango, Tack!

Jag visade en kompis detta med och han säger att det går att lösa mer effektivt genom att inte använda ett index eftersom man måste beräkna offset'et varje gång.

Men eftersom jag fortfarande lär mig C så ger han mig inte svaret på en gång :( ...     ;)  jag lyckas dock inte klura ut det. Nån som har ett förslag?

Permalänk: https://www.webforum.nu/p/2085506

## #4 — spango, 2008-02-29T10:40Z

Tja, du kan ju använda pekararitmetik... \*hint\*

Kom ihåg att ett uttryck som *arr\[n\]* är detsamma som *\*(arr + n)*. Alltså blir uttrycket *(arr + n)* en direkt pekare till element *n* i din array.

Permalänk: https://www.webforum.nu/p/2085540

## #5 — Phorpher, 2008-02-29T10:54Z

En annan variant är att kolla på bitoperationer som är väldigt effektiva.

Permalänk: https://www.webforum.nu/p/2085542

## #6 — PeW, 2008-02-29T21:28Z

<http://www.codeproject.com/KB/cpp/endianness.aspx>

Permalänk: https://www.webforum.nu/p/2085672

---

Tråden på webben: https://www.webforum.nu/amne/c-cpp/169418-förbättra-big-endian-little-endian-loop
