2009-07-09 12 views

답변

14

한가지 가능성 Enumerable.Select를 사용된다 :

byte[] bytes; 
var shorts = bytes.Select(b => (short)b).ToArray(); 

Array.ConvertAll을 사용하는 것이다

byte[] bytes; 
var shorts = Array.ConvertAll(bytes, b => (short)b); 
+0

원래 추천 단어 (나중에 두 번째 단어를 추가하기 전에)는 다소 비효율적입니다. –

+1

또 다른 옵션은 bytes.Cast ()입니다. ToArray(); –

+0

실제로이 경우 InvalidCastException이 발생합니다. 간단한 설명은이 코드가 암시 적으로 박스형 바이트가 유효한 언 박싱 연산이 아닌 short에 언 박싱되도록하는 것입니다. 자세한 내용은 http://stackoverflow.com/questions/445471/puzzling-enumerable-cast-invalidcastexception을 참조하십시오. – jason

0
short[] wordArray = Array.ConvertAll(byteArray, (b) => (short)b); 
-2
byte[] bytes; 
var shorts = bytes.Select(n => System.Convert.ToInt16(n)).ToArray(); 
+0

매우 비효율적입니다. 모든 요소에 대해 convert.ToInt16()을 호출하여 임시 목록에 저장 한 다음 새 배열에 복사합니다. –

+0

예, 비효율적입니다. 나는 그것이 더 안전하다고 생각하고있다. –

+0

캐스팅보다 안전합니까? 바이트 간 변환은 항상 작동합니다. 예외를 throw 할 수는 없습니다 –

2

shorthard 두 바이트의 화합물이다. 파일에 모든 단락을 진정한 반바지로 쓰고 있다면 이러한 변환이 잘못되었습니다.

short s = (short)(bytes[0] | (bytes[1] << 8)) 
+0

이것은 작동하지 않습니다.이것을 작동 시키려면 이렇게해야합니다. short s = (short) ((bytes [0] << 8) | bytes [1]); – DaveN59

+3

리틀 엔디안을 가정하면 다음과 같아야합니다. short s = (short) (bytes [0] | (bytes [1] << 8)) – Indy9000

2
short value = BitConverter.ToInt16(bytes, index); 
48

사용 Buffer.BlockCopy : 당신은 같은 것을 사용하여, 진정한 짧은 값을 얻기 위해 2 바이트를 사용해야합니다.

바이트 배열의 절반 크기의 짧은 배열을 생성하고, 상기 바이트 데이터를 복사 그것은 훨씬 빠른 방법

short[] sdata = new short[(int)Math.Ceiling(data.Length/2)]; 
Buffer.BlockCopy(data, 0, sdata, 0, data.Length); 

.

+1

해결책은 제가 누릴 자격이 없지만 지금 당장 필요합니다! – DaMachk

0

나는 모른다. 그러나 나는이 질문에 또 다른 aproach를 기대했을 것이다. 반바지의 순서로 바이트 시퀀스를 변환 할 때, 내가 그것을 @ 피터처럼했을 것 는 파일의 바이트 엔디안에 따라

short s = (short)((bytes[0] << 8) | bytes[1]) 

short s = (short)(bytes[0] | (bytes[1] << 8)) 

또는

했다.

그러나 OP에서는 파일의 단락 또는 파일의 정의에 대해 언급하지 않았습니다. 그의 경우 두 배의 메모리가 필요하기 때문에 바이트 배열을 짧은 배열로 변환하는 것은 의미가 없으며 다른 곳에서 사용되는 경우 바이트를 short로 변환해야하는지는 의심 스럽습니다.

관련 문제