webForumDet fria alternativet

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

C/C++

5 svar · 863 visningar · startad av Danielkun

Medlem sedan maj 2003361 inlägg
Frågan#1

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;}
Medlem sedan juni 20008 205 inlägg
#2

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;}
Medlem sedan maj 2003361 inlägg
#3

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?

Medlem sedan juni 20008 205 inlägg
#4

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.

Medlem sedan feb. 20002 300 inlägg
#5

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

Medlem sedan juni 200010 432 inlägg
272 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
124 ms — hämta tråd, inlägg och bilagor (db)
145 ms — ändringar (db)