Преобразование int в байты и эффективное переключение порядка байтов - PullRequest
3 голосов
/ 06 мая 2011

Я должен сделать некоторое int -> байтовое преобразование и переключиться на байтовый порядок для некоторых MIDI-данных, которые я пишу.Прямо сейчас я делаю это так:

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 оба раза (поскольку я могу позволить себе роскошь знать, сколько байтов у него будет).

Есть ли более удобный способ, которым я должен подходить к этому?

Ответы [ 3 ]

14 голосов
/ 06 мая 2011

Используйте Базовые функции замены базового ядра .

int32_t unswapped = 0x12345678;
int32_t swapped = CFSwapInt32HostToBig(unswapped);
char* a = (char*) &swapped;
[myMutableData appendBytes:a length:sizeof(int32_t)];
0 голосов
/ 06 мая 2011

Это должно сработать:

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

Вы можете упаковать его в функцию любым удобным для вас способом. Побитовый обмен должен скомпилироваться в довольно аккуратную сборку:)

Надеюсь, это поможет:)

0 голосов
/ 06 мая 2011
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--;
     }
}
...