![]() |
![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
|
Welcome to Vista Forums we are your forum to discuss Windows Vista x64 and x86 systems. Whether you need help or just want to post an idea you have on Vista, this is the forum for you.
br> br> |
| |||||||
![]() |
| | Thread Tools | Display Modes |
| | #1 (permalink) |
| Guest | PInvoke and Decimal to Binary Conversion I'm trying to wrap my head around binary arithmetic, since i've been given the task to automate a Programmable Logic Controller. The PLC comes with a DLL and some VB6 Example code with Declarations that i want to convert to Powershell. First question Anyone know of examples of PInvoking in Powershell? Can PInvoke done using powershell alone or do i have to create a .NET Wrapper Assembly and call that from PS? Second Question: in an effort to understand binary arithmetic i've created the verbose function below implementing the logic presented in http://en.wikipedia.org/wiki/Base_2#Decimal, and i'm wondering if it could be rewritten more efficiently, ..NET exposes [Convert]::ToString([int]$value, 2) wich will probably be faster than PS scripting, however i'm trying learn how to optimize my powershell code. PS> function IntToBaseTwo([int]$value, [string]$bits='') { $remainder = $value % 2 $bits = [string]$remainder + $bits $value = ($value - $remainder) / 2 if($value -gt 0) { IntToBaseTwo $value $bits } else { $bits } } PS> IntToBaseTwo 159 11111001 -- Joris van Lier Please note that all scripts are supplied "as is" and with no warranty Blog: http://whizzrd.spaces.live.com |
My System Specs![]() |
| | #2 (permalink) |
| Guest | Re: PInvoke and Decimal to Binary Conversion 1) There is no inbuilt functionality for PInvoking in PowerShell. There are two ways I can think of doing it right now. a) Use inline C# like Lee shows here: http://www.leeholmes.com/blog/Librar...ineCInMSH.aspx b) If the call just takes primitives types (numbers, strings) then I've got this script you can use (attached). Its not particularly well documented and a little convoluted. What it does is use reflection emit to create the code for doing the PInvoke and returns a scriptblock that will do the PInvoke. Here is an example of me using it to set the internet explorer window as the foreground window: PS C:\demo> & .\CreateNativeMethodScriptBlock.ps1 Values were not provided for parameters: methodName, dllName, returnType, parameterTypes Usage: CreateNativeMethodScriptBlock.ps1 [string]$methodName [string]$dllName [type]$returnType [type[]]$parameterTypes PS C:\demo> $SetForegroundWindow = & .\CreateNativeMethodScriptBlock.ps1 SetForegroundWindow "User32.dll" ([bool]) ([Int Ptr]); PS C:\demo> $iexplore = get-process iexplore PS C:\demo> $iexploreHandle = $iexplore.MainWindowHandle PS C:\demo> & $SetForegroundWindow $iexploreHandle PS C:\demo> 2) .NET exposes [Convert]::ToString([int]$value, 2) wich will probably be faster than PS scripting, however i'm trying learn how to optimize my powershell code. I would suggest you just use the .Net method in that case. If you reeeally want to spend time on it, use time-expression to measure what lines take up more time. But my opinion is you should focus on making it readable rather than optimizing for speed unless its really critical. Remember that what takes up more time could change with the next version. -- Marcel Ortiz [MSFT] Windows PowerShell Microsoft Corporation This posting is provided "AS IS" with no warranties, no confers rights. "Joris van Lier" <whizzrd@hotmail.com> wrote in message news:eVYoKAkjHHA.3980@TK2MSFTNGP04.phx.gbl... I'm trying to wrap my head around binary arithmetic, since i've been given the task to automate a Programmable Logic Controller. The PLC comes with a DLL and some VB6 Example code with Declarations that i want to convert to Powershell. First question Anyone know of examples of PInvoking in Powershell? Can PInvoke done using powershell alone or do i have to create a .NET Wrapper Assembly and call that from PS? Second Question: in an effort to understand binary arithmetic i've created the verbose function below implementing the logic presented in http://en.wikipedia.org/wiki/Base_2#Decimal, and i'm wondering if it could be rewritten more efficiently, ..NET exposes [Convert]::ToString([int]$value, 2) wich will probably be faster than PS scripting, however i'm trying learn how to optimize my powershell code. PS> function IntToBaseTwo([int]$value, [string]$bits='') { $remainder = $value % 2 $bits = [string]$remainder + $bits $value = ($value - $remainder) / 2 if($value -gt 0) { IntToBaseTwo $value $bits } else { $bits } } PS> IntToBaseTwo 159 11111001 -- Joris van Lier Please note that all scripts are supplied "as is" and with no warranty Blog: http://whizzrd.spaces.live.com |
My System Specs![]() |
| | #3 (permalink) |
| Guest | Re: PInvoke and Decimal to Binary Conversion I do agree with Marcel, but just to show how you can do this fairly fast in powershell (only about 5 times slower than calling Convert.ToString), here's a lookup table approach. /Staffan [string[]] $base2Lookup = @('00000000','00000001','00000010','00000011','00000100','00000101','00000110','00000111','00001000','00001001', '00001010','00001011','00001100','00001101','00001110','00001111','00010000','00010001','00010010','00010011', '00010100','00010101','00010110','00010111','00011000','00011001','00011010','00011011','00011100','00011101', '00011110','00011111','00100000','00100001','00100010','00100011','00100100','00100101','00100110','00100111', '00101000','00101001','00101010','00101011','00101100','00101101','00101110','00101111','00110000','00110001', '00110010','00110011','00110100','00110101','00110110','00110111','00111000','00111001','00111010','00111011', '00111100','00111101','00111110','00111111','01000000','01000001','01000010','01000011','01000100','01000101', '01000110','01000111','01001000','01001001','01001010','01001011','01001100','01001101','01001110','01001111', '01010000','01010001','01010010','01010011','01010100','01010101','01010110','01010111','01011000','01011001', '01011010','01011011','01011100','01011101','01011110','01011111','01100000','01100001','01100010','01100011', '01100100','01100101','01100110','01100111','01101000','01101001','01101010','01101011','01101100','01101101', '01101110','01101111','01110000','01110001','01110010','01110011','01110100','01110101','01110110','01110111', '01111000','01111001','01111010','01111011','01111100','01111101','01111110','01111111','10000000','10000001', '10000010','10000011','10000100','10000101','10000110','10000111','10001000','10001001','10001010','10001011', '10001100','10001101','10001110','10001111','10010000','10010001','10010010','10010011','10010100','10010101', '10010110','10010111','10011000','10011001','10011010','10011011','10011100','10011101','10011110','10011111', '10100000','10100001','10100010','10100011','10100100','10100101','10100110','10100111','10101000','10101001', '10101010','10101011','10101100','10101101','10101110','10101111','10110000','10110001','10110010','10110011', '10110100','10110101','10110110','10110111','10111000','10111001','10111010','10111011','10111100','10111101', '10111110','10111111','11000000','11000001','11000010','11000011','11000100','11000101','11000110','11000111', '11001000','11001001','11001010','11001011','11001100','11001101','11001110','11001111','11010000','11010001', '11010010','11010011','11010100','11010101','11010110','11010111','11011000','11011001','11011010','11011011', '11011100','11011101','11011110','11011111','11100000','11100001','11100010','11100011','11100100','11100101', '11100110','11100111','11101000','11101001','11101010','11101011','11101100','11101101','11101110','11101111', '11110000','11110001','11110010','11110011','11110100','11110101','11110110','11110111','11111000','11111001', '11111010','11111011','11111100','11111101','11111110','11111111') function Convert-ToBase2([int] $a){ if (!$a){'0'} $s='' [int[]] $script:mask = 0xff,0xff00,0xff0000,0xff000000 [int[]] $script:shift = 0x1,0x100,0x10000,0x1000000 for ($i = 0;$i -lt 4; ++$i ){ $index = ($a -band $mask[$i])/($shift[$i]) $s = $base2Lookup[$index] + $s } $s.TrimStart('0') } "Marcel J. Ortiz [MSFT]" <mosoto@online.microsoft.com> wrote in message news:0B9A9319-F350-4D0A-9ACA-3BDE2E2E7355@microsoft.com... > 1) There is no inbuilt functionality for PInvoking in PowerShell. There > are > two ways I can think of doing it right now. > a) Use inline C# like Lee shows here: > http://www.leeholmes.com/blog/Librar...ineCInMSH.aspx > > b) If the call just takes primitives types (numbers, strings) then > I've got this script you can use (attached). Its not particularly well > documented and a little convoluted. What it does is use reflection emit to > create the code for doing the PInvoke and returns a scriptblock that will > do > the PInvoke. Here is an example of me using it to set the internet > explorer > window as the foreground window: > > PS C:\demo> & .\CreateNativeMethodScriptBlock.ps1 > Values were not provided for parameters: methodName, dllName, returnType, > parameterTypes > > Usage: > CreateNativeMethodScriptBlock.ps1 [string]$methodName [string]$dllName > [type]$returnType [type[]]$parameterTypes > > PS C:\demo> $SetForegroundWindow = & .\CreateNativeMethodScriptBlock.ps1 > SetForegroundWindow "User32.dll" ([bool]) ([Int > Ptr]); > PS C:\demo> $iexplore = get-process iexplore > PS C:\demo> $iexploreHandle = $iexplore.MainWindowHandle > PS C:\demo> & $SetForegroundWindow $iexploreHandle > PS C:\demo> > > > 2) .NET exposes [Convert]::ToString([int]$value, 2) wich will probably be > faster than PS scripting, > however i'm trying learn how to optimize my powershell code. > > I would suggest you just use the .Net method in that case. If you > reeeally > want to spend time on it, use time-expression to measure what lines take > up > more time. But my opinion is you should focus on making it readable > rather > than optimizing for speed unless its really critical. Remember that what > takes up more time could change with the next version. > > -- > Marcel Ortiz [MSFT] > Windows PowerShell > Microsoft Corporation > This posting is provided "AS IS" with no warranties, no confers rights. > > "Joris van Lier" <whizzrd@hotmail.com> wrote in message > news:eVYoKAkjHHA.3980@TK2MSFTNGP04.phx.gbl... > I'm trying to wrap my head around binary arithmetic, since i've been given > the task to automate a Programmable Logic Controller. > The PLC comes with a DLL and some VB6 Example code with Declarations that > i > want to convert to Powershell. > > First question > Anyone know of examples of PInvoking in Powershell? > Can PInvoke done using powershell alone or do i have to create a .NET > Wrapper Assembly and call that from PS? > > Second Question: > in an effort to understand binary arithmetic i've created the verbose > function below implementing the logic presented in > http://en.wikipedia.org/wiki/Base_2#Decimal, and i'm wondering if it could > be rewritten more efficiently, > .NET exposes [Convert]::ToString([int]$value, 2) wich will probably be > faster than PS scripting, > however i'm trying learn how to optimize my powershell code. > > PS> function IntToBaseTwo([int]$value, [string]$bits='') { > $remainder = $value % 2 > $bits = [string]$remainder + $bits > $value = ($value - $remainder) / 2 > if($value -gt 0) { IntToBaseTwo $value $bits } > else { $bits } > } > > PS> IntToBaseTwo 159 > 11111001 > > -- > Joris van Lier > Please note that all scripts are supplied "as is" and with no warranty > Blog: http://whizzrd.spaces.live.com > |
My System Specs![]() |
![]() |
| Thread Tools | |
| Display Modes | |
| |
Similar Threads | ||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| I don“t view the value right after six decimal place in Excel | Claudio | .NET General | 0 | 08-05-2008 01:46 PM |
| Convert Decimal to Binary | Cerox | PowerShell | 6 | 02-28-2008 03:13 PM |
| Stock Gadget decimal places | Qualnhick | Vista General | 0 | 11-24-2007 10:04 AM |
| How to embed manifest in TCL binary? - mt.exe corrupting my binary | Kshitij | Vista General | 0 | 02-14-2007 04:42 PM |
| Question regarding negative (hexa)decimal numbers | =?Utf-8?B?ZHJlZXNjaGtpbmQ=?= | PowerShell | 3 | 09-19-2006 07:21 AM |