Windows Vista Forums
Vista Forums Home Join Vista Forums Windows 7 Forum Vista Tutorials Tags
Welcome to Windows Vista Forums. Our forum is dedicated to helping you find solutions with any problems, errors or issues you are experiencing with Windows Vista. The Vista forum also covers news and updates and has an extensive Windows Vista tutorial section that covers a wide range of tips and tricks.

Go Back   Vista Forums > Misc Newsgroups > PowerShell

Vista - PInvoke and Decimal to Binary Conversion

Reply
 
Old 05-04-2007   #1 (permalink)
Joris van Lier


 
 

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 SpecsSystem Spec
Old 05-04-2007   #2 (permalink)
Marcel J. Ortiz [MSFT]


 
 

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 SpecsSystem Spec
Old 05-04-2007   #3 (permalink)
Staffan Gustafsson


 
 

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 SpecsSystem Spec
Reply

Thread Tools


Similar Threads
Thread Forum
find decimal separator VB Script
I don“t view the value right after six decimal place in Excel .NET General
Convert Decimal to Binary PowerShell
Stock Gadget decimal places Vista General
How to embed manifest in TCL binary? - mt.exe corrupting my binary Vista General


Vista Forums is an independent web site and has not been authorized,
sponsored, or otherwise approved by Microsoft Corporation.
"Windows Vista", the Start Orb, and related materials are trademarks of Microsoft Corp.
© Designer Media Ltd

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46