2012-02-28 2 views
1

Ну это будет странный вопрос, но я хочу знать, как я могу сделать это, позвольте мне дать вам более подробную информацию о моем вопросе:бит преобразования массивов

позволяет сказать, что у меня есть

byte[] byteArray = new byte[8] { 16, 0, 16, 0, 16, 0, 16, 0 }; 

и скажем память выглядит следующим образом:

------------0---1---2---3---4---5---6---7- 
byteArray---10--00--10--00--10--00--10--10 

Я хочу метод, который преобразует этот массив в короткий массив WITOUTH любой петли, потому что это уже есть, я имею в виду его:

------------0---1---2---3---4---5---6---7- 
byteArray---10--00--10--00--10--00--10--10 
------------0-------1-------2-------3----- 
shortArray--1000----1000----1000----1000-- 

Я просто хочу видеть массив байтов как короткий массив, они просто байтовые блоки. Я могу сделать для него алгоритм, как с моими знаниями, но я должен использовать циклы, но я чувствую, что это можно сделать без циклов, потому что это уже в памяти и длина массива байтов является мощность 2

Он даже может быть превращена в нечто вроде этого:

------------0-----------1----------- 
intArray----10001000----10001000---- 
------------0----------------------- 
longArray---1000100010001000-------- 

  • Я хочу сделать Тхи с указателями. Но я получаю сообщение об ошибке:

//--Error 1 Cannot convert type 'byte[]' to 'short*' 

ответ

2

Вы можете бросить указатель быть указателем на трусах:

short* shortArray = (short*)byteArray; 

Конечно, с большой силой приходит большая ответственность.

+0

Примечание. В зависимости от того, что вы пытаетесь сделать, вам, возможно, также придется беспокоиться о проблемах с энтианностью. Но неясно, что вам нужно от того, что вы написали. – user1118321

+0

хорошо это безопасный код думаю. и я не знаю, почему они называют это небезопасным. Я должен искать его – haxxoromer

+0

Короткий указатель в C#? Да, это не вызовет неприятностей. – chrischu

2

Предполагая, что у вас нет проблем, порядком байт, это должно сделать трюк:

byte[] srcOctets = ReadOctets() ; 
int  n   = srcOctets.Length/sizeof(short) ; 
short[] tgtShorts = new short[ n ] ; 

Buffer.BlockCopy(srcOctets, 0 , tgtShorts , 0 , n * sizeof(short)) ; 

Вы в основном перемещение октета в буфере, лежащий в основе экземпляра исходного массива в буфер, лежащий в основе экземпляра целевого массива. Исходный и целевой массивы могут быть любого примитива : Boolean, Char, SByte, Byte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Single или Double.

Смежные вопросы