2011-05-06 29 views
3

我正在寫一些MIDI數據,我必須進行一些int - > byte轉換並切換到big endian。現在,我正在做它喜歡:將int轉換爲字節並有效切換endian

int tempo = 500000; 
char* a = (char*)&tempo; 

//reverse it 
inverse(a, 3); 

[myMutableData appendBytes:a length:3]; 

和反函數:

void inverse(char inver_a[],int j) 
{ 
    int i,temp; 
    j--; 
    for(i=0;i<(j/2);i++) 
    { 
     temp=inver_a[i]; 
     inver_a[i]=inver_a[j]; 
     inver_a[j]=temp; 
     j--; 
    } 
} 

它的工作原理,但它不是真正的乾淨,我不喜歡,我不得不指定3兩次(因爲我有很高的知道它將結束多少字節)。

有沒有更方便的方法我應該接近這個?

回答

14

使用Core Foundation byte swapping functions

int32_t unswapped = 0x12345678; 
int32_t swapped = CFSwapInt32HostToBig(unswapped); 
char* a = (char*) &swapped; 
[myMutableData appendBytes:a length:sizeof(int32_t)]; 
+0

好了 - 這看起來不錯 - 但我有我的限制ç技能設置它的麻煩。你能用一行代碼示例幫忙嗎?調用'tempo'交換?轉換到char *的地方在哪裏? – 2011-05-06 07:47:34

+0

@jn_pdx:請參閱編輯答案 – JeremyP 2011-05-06 08:13:10

0
int tempo = 500000; 

//reverse it 
inverse(&tempo); 

[myMutableData appendBytes:(char*)tempo length:sizeof(tempo)]; 

和反函數:

void inverse(int *value) 
{ 
    char inver_a = (char*)value; 
    int j = sizeof(*value); //or u can put 2 
    int i,temp; 
    // commenting this j--; 
    for(i=0;i<(j/2);i++) 
    { 
     temp=inver_a[i]; 
     inver_a[i]=inver_a[j]; 
     inver_a[j]=temp; 
     j--; 
    } 
} 
+0

將引發EXC_BAD_ACCESS錯誤。 – 2011-05-06 07:35:18

+0

也沒有完成任何事情; 'value'不是通過引用傳遞的,並且不會返回反轉的副本。 – 2011-05-06 07:47:57

+0

確定更新了代碼,,,,以及訪問不良的地方在哪裏......? – 2011-05-06 09:03:56

0

這應該做的伎倆:

/* 
    Quick swap of Endian.  
*/ 

#include <stdio.h> 

int main(){ 

    unsigned int number = 0x04030201; 
    char *p1, *p2; 
    int i; 

    p1 = (char *) &number; 
    p2 = (p1 + 3); 


    for (i=0; i<2; i++){ 
     *p1 ^= *p2; 
     *p2 ^= *p1; 
     *p1 ^= *p2; 
    } 


return 0; 
} 

你可以打包成你想要使用它的任何方式的功能。按位交換應該編譯成一些漂亮整潔的裝配:)

希望它能幫助:)