2014-09-10 7 views
7

배열을 byte[]에서 sbyte[]으로 변환하려고 시도했습니다. 이미이 시도byte []를 sbyte []로 변환

byte[] unsigned = { 0x00, 0xFF, 0x1F, 0x8F, 0x80 }; 

:

여기 내 샘플 배열이다

sbyte[] signed = (sbyte[])((Array)unsigned); 

그러나 그것은 작동하지 않습니다. 이 조작 후에 h 열에 값이 없습니다.

누구에게 더 좋은 아이디어가 있습니까?

+1

이 코드는 컴파일되고 오류가 발생하지 않는다는 의미에서 작동합니다. 그것은 거의 모든 상황에서'sbyte []'로 사용될 수있는 배열을 만들지 만 런타임에 의해 여전히'byte []'로 표시됩니다. "배열에 값이 없다"는 것이 무슨 뜻인지 잘 모르겠다. 나에게 배열은 예상대로 {{0, -1, 31, -113, -128}이다. – CodesInChaos

+0

컴파일 한 후 서명 된 배열에 값이 없습니다. Visual Studio에서 "?" 부호가있는 배열의 모든 요소에서. – REMberry

+0

좋아, 내가 서명 된 배열에서 요소를 가져 오려고하고 여전히 작동합니다. 당신의 도움을 주셔서 감사합니다. 이 솔루션을 사용하려고합니다. – REMberry

답변

12
sbyte[] signed = (sbyte[]) (Array) unsigned; 

이는 바이트와 sbyte의 길이가 메모리에서 같고 메모리 표현을 변경하지 않고도 변환 할 수 있기 때문에 가능합니다.

그러나이 방법을 사용하면 디버거에 이상한 버그가 발생할 수 있습니다. 바이트 배열이 크지 않은 경우 Array.ConvertAll을 대신 사용할 수 있습니다.

sbyte[] signed = Array.ConvertAll(unsigned, b => unchecked((sbyte)b)); 
+0

'unchecked ((sbyte) b)'를 사용하면 검사 된 산술을 사용할 수 있어도 작동합니다. 또한 오버 플로우가 단순히 성능 최적화가 아닌 의도적 인 문서로 사용됩니다. – CodesInChaos

+0

메모리가 오버 플로우 검사가 바이트/sbytes에 적용되지 않는다고 말했습니다. 나는 틀렸을 수도있다. ** 수정 : ** fixed now :) –

+0

'sbyte'에 255를 던지면 확실히 확인 된 산술 연산이 발생합니다. 혼란 스러울 수있는 것은'(byte) 255 + (byte) 255'가 던지지 않는다는 것입니다. 피연산자가 오버 플로우하지 않는'int'로 승격되기 때문입니다. – CodesInChaos

1

쉽게 다음과 같이 수행

sbyte[] signed = unsigned.Select(b=>(sbyte)b).ToArray(); 

내가 구문에 대한 확실하지 않다. 그것을 확인하십시오.

+1

이것은 작동합니다. 하지만 1)'ConvertAll'은 더 빠르고 더 읽기 쉽습니다. 2) 나는'unchecked ((sbyte) b)'를 선호합니다. 자세한 내용은 @ Sepehr의 답변을 참조하십시오. – CodesInChaos

2

사용 방법은 Buffer.BlockCopy일까요? 이 대답에 대한 좋은 점은 바이트 단위로 캐스팅 검사를하지 않는 것입니다. 이 대답에 대한 나쁜 점은 바이트 단위의 캐스팅 검사를 피하는 것입니다.

var unsigned = new byte[] { 0x00, 0xFF, 0x1F, 0x8F, 0x80 }; 
var signed = new sbyte[unsigned.Length]; 
Buffer.BlockCopy(unsigned, 0, signed, 0, unsigned.Length); 

이 단지 복사 바이트, byte.MaxValue 상기 값은 음수 sbyte 값을 가질 것이다.

두 줄의 코드를 사용하지만 빠릅니다.

+0

'@'가 필요 없습니다. 'signed' /'unsigned'는 C#에서는 키워드가 아닙니다. – CodesInChaos

+0

@CodesInChaos 그래서 내가 잘못 이끌었습니다. – Jodrell

관련 문제