2010-05-28 3 views
2

Мне интересно, существует ли объект C, эквивалентный методу BitConverter.GetBytes() .Net.Objective C BitConverter Equivalent

Например, в C#, можно написать что-то вроде этого:

байт [] lengthPrefix = BitConverter.GetBytes (message.length);

Что было бы эквивалентом в Objective C?

Некоторые примеры кода были бы весьма признательны.

Заранее спасибо.

ответ

2

Если вам не нужен конкретный Endian-Несс:

unsigned char * lengthPrefix = (unsigned char *)&message.length; 

Или скопировать 32-битный буфер, если это необходимо.

unsigned char lengthPrefixBuffer[4]; 
memcpy(lengthPrefixBuffer, &message.length, 4); 
+0

Вы берете адрес временного возвращаемого целого числа. Скомпилирует ли это? Он может быть в регистре ... 'Длина NSInteger = message.length; unsigned char * lengthPrefix = (unsigned char *) & length; ' –

+0

+1 хотя и не очень хорошо работает (NSInteger == long), хотя я, вероятно, использовал бы sizeof на всякий случай в версии memcpy. –

+0

В Foundation есть целый набор функций, чтобы делать байтовую привязку байтов, связанных с endian. http://developer.apple.com/mac/library/documentation/cocoa/reference/foundation/Miscellaneous/Foundation_Functions/Reference/reference.html#jumpTo_181 – JeremyP

0

Sin Objective-C является корнем C, вы можете использовать побитовые операторы для достижения чего-то подобного.

В рамках COCOA/COCOA-TOUCH нет ничего, что сделало бы это автоматически для вас (например, BitConverter .NET).

0

байт [] lengthPrefix = BitConverter.GetBytes (message.length); эквивалент, который будет

long ID = length; 
Byte *some = (Byte*)&ID; 
    Byte b1 = some[0]; 
    Byte b2 = some[1]; 
    Byte b3 = some[2]; 
    Byte b4 = some[3]; 
Byte lengthPrefix[]= {b1,b2,b3,b4}; 

Основная идея, сколько байтов вам нужно ... так где-то перед этой операцией указать, какую длину вы хотите и сколько байтов вы хотите. Так что надолго достаточно 4 байта. Для uint32 вам, вероятно, нужно больше.