2

PowerShell은 산술 연산 및 변환 후에 경계 검사를 수행하는 것처럼 보입니다. 예를 들어, 다음과 같은 작업이 실패 :PowerShell에서 오버플로 검사를 억제하는 방법은 무엇입니까?

[byte]$a = 255 
$a++ 

$a = [byte]256 

모듈 또는 C# 및 추가 입력을 통해 수동 계산에 의존하지 않고 오버 플로우 또는 배역을 시행 할 수있는 방법이 있나요?

+1

형식을 명시 적으로 캐스팅하고이 형식에 비해 너무 큰 값을 할당하려고하므로 작업이 실패합니다. 이것은 의도적으로 설계된 동작입니다. PowerShell에서 오버플로가 발생하면 어떻게해야합니까? MAXVALUE에서 값을 잘라 버리시겠습니까? 모듈로 연산으로 값을 래핑 하시겠습니까? 오버플로 값을 새 변수에 할당 하시겠습니까? PowerShell은 특정 상황에서 오버플로를 처리하는 올바른 방법이 무엇인지 추측 할 수 없으므로 오류를 throw하는 것이 유일한 일입니다. –

+1

내가 말했듯이 오버 플로우 검사를 수행하지 않는 다른 모든 (모든?) 프로그래밍 언어의 동작, 즉 모듈러스 연산을 찾고 있습니다. 많은 암호화 및 해시 알고리즘이이를 기반으로하므로 PowerShell에서 지원하는 경우 완벽하게 이해할 수 있습니다. – Chrysler

+0

물론 PowerShell은 모듈러스 연산을 지원합니다. 지금 당장 바라는 "명백한 것"이 무엇인지에 관해서는 맹목적인 추측을하지 않습니다. 모듈로 연산을 원하면 : 모듈로 연산을 적용하십시오. 문제 해결됨. –

답변

1

PowerShell은 프로그래밍 언어가 아닌 스크립팅 언어이므로 과부하 연산자와 같은 많은 고급 기술을 지원하지 않습니다 (이 경우 편리 할 수 ​​있음).

이미 제안한 사항을 추가하면 오류를 잡을 수 있습니다.

[byte]$a = 255 
try {$a++} catch {$a=1} 

또는 직접 함수를 작성하고 거기에서 재미있는 모듈을 수행하십시오.

1

PowerShell에서 원하는 동작을 달성 할 수 있지만 해킹 비트입니다. 그리고 아마도 더 좋은 방법이있을 것입니다.

암호화 기능을 원한다면 이미 BCL에 내장되어있는 TON이 있으며 PowerShell (MD5, SHA, RSA, X509 등)에 완전히 액세스 할 수 있습니다. 물건도).

하지만 PowerShell에서 선택하지 않은 연산을 수행하는 방법에 대한 죽은 세트라면, 이것은 당신이 (기본적으로 우리는 C# 코드를 삽입하고, 선택하지 않은 키워드를 사용하는) 원하는 무엇을 제공해야 해킹은 다음과 같습니다

$members = @' 
public static UInt32 ToUInt32(int value) 
{ 
    unchecked 
    { 
     return (UInt32)value; 
    } 
} 


public static byte ToByte(int value) 
{ 
    unchecked 
    { 
     return (byte)value; 
    } 
} 
'@; 

$type = Add-Type -Name "Convert" -Namespace "Helpers" ` 
     -MemberDefinition $members -PassThru -ErrorAction SilentlyContinue; 

사용법 : 주의

PS C:\Some\Folder> [Helpers.Convert]::ToUInt32(-1); 
4294967295 

PS C:\Some\Folder> [Helpers.Convert]::ToByte(-1); 
255 

PS C:\Some\Folder> [Helpers.Convert]::ToByte(256); 
0 

:

  • [Helpers.Convert]::To...[System.Convert]::To...이 아닙니다.
  • 다른 방법이 필요한 경우 실제 C# 메서드를 코드 맨 위에있는 $members 블록에 삽입해야합니다.
  • 같은 NamespaceName 조합의 행에 Add-Type을 여러 번 실행하면 동일한 PowerShell 세션에서이 명령이 실패합니다. 이전에 등록 된 유형으로 남게됩니다. -이 특정 시나리오를 무시하기 위해 -ErrorAction SilentlyContinue을 추가했습니다. 그런 식으로이 코드를 .ps1 스크립트에 덤프하고 매번 한 번 호출하여 메서드를 사용하면 항상 존재합니다. - 그러나 C# 코드를 수정하고 다시 테스트하는 경우 변경 작업을 수행 할 때마다 형식 이름을 변경해야합니다. 좀 괴롭다.
관련 문제