Windows Vista Forums
Vista Forums Home Join Vista Forums Donate Vista Tutorials Tags

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.
Register at Vista forums...the world biggest Windows Vista resource Join Vista Forums Now

Go Back   Vista Forums > Microsoft Technical Newsgroups > PowerShell

PInvoke and Decimal to Binary Conversion

Update your Vista Drivers Update Your Drivers Now!!
Closed Thread
 
Thread Tools Display Modes
Old 05-04-2007   #1 (permalink)
Joris van Lier
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 SpecsSystem Spec
Old 05-04-2007   #2 (permalink)
Marcel J. Ortiz [MSFT]
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 SpecsSystem Spec
Old 05-04-2007   #3 (permalink)
Staffan Gustafsson
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 SpecsSystem Spec
Closed Thread

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


Update your Vista Drivers Update Your Drivers Now!!

Vistax64.com 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 2005-2008