【问题标题】:Converting int to bytes and switching endian efficiently将 int 转换为字节并有效地切换字节序
【发布时间】:2011-05-06 07:03:26
【问题描述】:

对于我正在编写的一些 MIDI 数据,我必须进行一些 int -> 字节转换并切换到大端。现在,我正在这样做:

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(因为我有幸知道它最终会占用多少字节)。

有没有更方便的方法可以解决这个问题?

【问题讨论】:

    标签: objective-c c endianness


    【解决方案1】:

    使用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)];
    

    【讨论】:

    • 好的 - 这看起来很棒 - 但我在设置它时遇到了我有限的 C 技能的问题。你能帮忙提供一行代码示例吗?在tempo 上调用交换?到char* 的转换从何而来?
    【解决方案2】:

    这应该可以解决问题:

    /*
      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;   
    }
    

    你可以用任何你想用的方式把它打包成一个函数。按位交换应该编译成一些非常整洁的程序集:)

    希望对你有帮助:)

    【讨论】:

      【解决方案3】:
      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--;
           }
      }
      

      【讨论】:

      • 也没有完成任何事情; value 不通过引用传递,也不返回反向副本。
      • ok 更新了代码,,,,坏访问在哪里...??
      • 是在没有参考的情况下通过节奏的结果
      猜你喜欢
      • 2016-03-04
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-18
      相关资源
      最近更新 更多