Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Порядок байт 
V
    Опции темы
mrbrooks
Дата 22.7.2009, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 7
Всего: 306



хеллоу ворлд!

Есть вопрос. Допустим имеется массив байтов из четырех элементов - получены они по сети.
Код

byte [] bytes = {0x7d, 0x2c, 0x21, 0x3b};

Очень хочется получить два short. Причем еще больше хочется что бы они были как {7d2c} , {213b} - то бишь байты местами не менялись.
Делаю так.
Код

byte [] bytes = {0x7d, 0x2c, 0x21, 0x3b};
short [] shorts = new short[bytes.Length/2];
Buffer.BlockCopy(bytes,0,shorts,0,bytes.Length); // результат - {2c7d} , {3b21} - что есть не айс.
//тот же результат. и как следствие - не айс.
shorts[0]=BitConverter.ToInt16(bytes,0);    //2c7d
shorts[1]=BitConverter.ToInt16(bytes,2);    //3b21        

Особенно импонирует свойство для чтения у класса BitConverter.IsLittleEndian. Очень полезная информация.

Собственно из ситуации выход простой - работаю со смещением и побитовым ИЛИ
Код

byte [] bytes = {0x7d, 0x2c, 0x21, 0x3b};
short [] shorts = new short[bytes.Length/2];
shorts[0] = (short)(bytes[0]<<8 | bytes[1]); //7d2c
shorts[1] = (short)(bytes[2]<<8 | bytes[3]); //213b  


Однако это как то не гламурно. У того же С/С++ есть ntoh.../hton... - для работы с сетевым порядком байт. 
Вот собственно и вопрос - есть ли в .Net более кошерный способ нежели со смещением.

PM MAIL   Вверх
mihryak
Дата 22.7.2009, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



Код

            shorts[0] = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(bytes, 0));    //7d2c
            shorts[1] = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(bytes, 2));    //213b


впрочем, по реализации там те же сдвиги (кто бы сомневался)
Код

public static short HostToNetworkOrder(short host)
{
    return (short) (((host & 0xff) << 8) | ((host >> 8) & 0xff));
}


Это сообщение отредактировал(а) mihryak - 22.7.2009, 17:56
PM MAIL ICQ   Вверх
mrbrooks
Дата 23.7.2009, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 7
Всего: 306



mihryak, спасибо земляк. То что доктор прописал. Искал эти методы в одном месте, а они оказались в другом  smile 

Решил вопрос так.
Код

byte [] bytes = {0x7d, 0x2c, 0x21, 0x3b};
short [] shorts = new short[bytes.Length/2];
for (int i = 0, j = 0; i<bytes.Length;i+=2,j++)
{
  shorts[j] = IPAddress.NetworkToHostOrder(BitConverter.ToInt16(bytes, i));
  Console.Write("0x{0}",shorts[j].ToStrings("x"));
}


Цитата(mihryak @  22.7.2009,  16:57 Найти цитируемый пост)
впрочем, по реализации там те же сдвиги (кто бы сомневался)

 smile. Все по классике.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0862 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.