Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 位转换阵列_C# - Fatal编程技术网

C# 位转换阵列

C# 位转换阵列,c#,C#,这将是一个奇怪的问题,但我想知道如何才能做到这一点,让我给你更多关于我的问题的细节: 假设我有 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 我想要一个方法,它可以将这个数组转换成没有任何循环的短数组,因为它已经存在了,我是

这将是一个奇怪的问题,但我想知道如何才能做到这一点,让我给你更多关于我的问题的细节:

假设我有

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
我想要一个方法,它可以将这个数组转换成没有任何循环的短数组,因为它已经存在了,我是说它:

------------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--------

  • 我想用指针来做这个。但我得到了一个错误:


您可以将指针强制转换为指向短裤的指针:

short* shortArray = (short*)byteArray;

当然,强大的力量带来巨大的责任。

你可以将指针投射成指向短裤的指针:

short* shortArray = (short*)byteArray;

当然,强大的力量带来巨大的责任。

假设你没有endian问题,这应该可以做到:

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、UInt64、IntPtr、UIntPtr、Single或Double。

假设没有endian问题,这应该可以实现以下功能:

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、UInt64、IntPtr、UIntPtr、Single或Double。

注意-根据您正在尝试的操作,您可能还需要担心尾数问题。但是还不清楚你是否需要从你所写的代码中学习。我认为这是不安全的代码。我真的不知道他们为什么说它不安全。我必须在C#中查找它的短指针?是的,这不需要麻烦。没有其他方法吗?如果你不介意复制数据的开销,Nicholas Carey的方法也会起作用。注意-根据你试图做的事情,你可能还需要担心endian ness问题。但是还不清楚你是否需要从你所写的代码中学习。我认为这是不安全的代码。我真的不知道他们为什么说它不安全。我必须在C#中查找它的短指针?是的,这不需要麻烦。没有其他方法吗?如果你不介意复制数据的开销,Nicholas Carey的方法也可以。