Как преобразовать int в 32-разрядное число в формате big-endian в Objective C?

#objective-c #ios4 #websocket

#objective-c #ios4 #websocket

Вопрос:

Я пытаюсь реализовать WebSocket handshake (76) в ObjC и не могу понять (поскольку я новичок в C и ObjC), как я могу получить следующее:

  1. Элемент списка
  2. У меня есть два числа

     155712099
    173347027
      
  3. Мне нужно преобразовать их в 32-разрядные числа с большим порядком

  4. объединить их в строку
  5. и выразить результирующую строку в ASCII

Помощь высоко ценится.

Комментарии:

1. Я пробовал CFSwapInt32HostToBig. Я просто не понимаю, как я могу увидеть в NSLog 32-разрядное число в двоичном формате. Fx, NSLog(@»%?», число)

2. Установите точку останова, затем щелкните правой кнопкой мыши переменную в вашем представлении переменных, а затем просмотрите память «variableName»

3. Для отображения числа в двоичном формате нет printf() спецификатора стиля. Вам придется создать свой собственный, если вам нужна такая функциональность.

4. @Joe, спасибо, хорошая идея. @Jonathan есть какие-нибудь подсказки о том, как я мог бы это сделать? ссылка или что-то еще.

Ответ №1:

Поскольку вы используете iPhone SDK, у вас есть доступ к Core Foundation. Использовать:

 uint32_t myInt32Value = ...;
uint32_t myInt32AsABigEndianNumber = CFSwapInt32HostToBig(myInt32Value);
  

Комментарии:

1. Интересно. В руководстве по программированию управления памятью для Core Foundation говорится, что эти функции доступны только в Mac OS X, но в документации по функциям говорится, что они доступны с iOS 2.0.

2. Итак, какой из них лучше в данном случае CFSwapInt32HostToBig или htonl?

3. Они делают ту же математическую вещь. Однако я предпочитаю CFSwapInt32HostToBig() , потому что оно встроено (пока htonl() есть extern ) и потому, что название лучше описывает то, чего я пытаюсь достичь (т. Е. переключиться на big endian, а не на сетевой порядок — если я не пытаюсь сделать что-то связанное с сетью, в этом случае я бы использовал htonl() .)

4. @Anomie: На самом деле, документация, похоже, не ограничивает эти функции только Mac OS X. В любом случае, они доступны на iOS с первого дня и полностью документированы там.

5. @JonathanGrynspan: Смотрите в самом низу связанной страницы: «Обратите внимание, что функции замены байтов Core Foundation доступны только в Mac OS X».

Ответ №2:

Objective-C основан на C и обычно имеет доступную стандартную библиотеку C, поэтому вы можете использовать стандартную htonl функцию. Затем вы можете выполнять манипуляции со строками, используя обычные строковые функции.