2011-05-06 115 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; 
} 

你可以打包成你想要使用它的任何方式的功能。按位交换应该编译成一些漂亮整洁的装配:)

希望它能帮助:)