Powershell中的数组帮助 - 正确的语法?

时间:2016-06-27 22:09:13

标签: c# arrays powershell

我正在编写一个小测试脚本来正确验证某些数据。我有数据通过串口传递到我的程序,所有数据都是十六进制字符串。我的代码看起来像一团糟,但它确实有效。

我有这个代码工作(看起来很糟糕!),它最终会显示格式正确的信息,但我觉得有一种更有效的方法来解析数据。

下面是我称之为的集群线 - 它将我的原始字符串放入数组,然后只使用与数据相关的字节,(其他字节是检查sum / header和控制序列的响应),所以我剥离它们,然后从十六进制转换为十进制到ascii。这可能是一种更有效的方法吗?

$vin = $b[6,10,11,12,13,17,18,19,20,24,25,26,27,31,32,33,34] |
    ForEach-Object { [Convert]::ToInt32($_,16) } |
    ForEach-Object { [Convert]::ToChar($_) } |
    ForEach-Object { Write-Host $_ -NoNewLine }

以下是我从设备获取的原始数据(示例消息):

  

49 02 01 00 00 00 4B 49 02 02 4C 31 54 44 49 02 03 35 32 36 33 49 02   04 35 42 34 37 49 02 05 35 38 38 36

(stream是5 7byte消息,前3个字节是头字节)

上面的代码将其转换为人类可读字段:KL1TD52635B475886

我使用类似的数组来解析来自我设备的响应消息,只是想确保我不会造成混乱!谢谢!

我可以提供更多代码,但我的问题是使用数组/解析。

谢谢!

1 个答案:

答案 0 :(得分:0)

我唯一看错的是你似乎想把结果字符串存储在变量($vin)中,但Write-Host只会在屏幕上输出它。

如果你打算重复使用它,你也可以把它变成一个函数:

function ConvertFrom-DeviceHexData {
    param(  
        [Parameter(
            Position=0, 
            Mandatory=$true, 
            ValueFromPipeline=$true,
            ValueFromPipelineByPropertyName=$true)
        ]
        [String]$inputString
    )

    $inputArray = $inputString.Split(" ")

    $outputArray = $inputArray[6,10,11,12,13,17,18,19,20,24,25,26,27,31,32,33,34] |
        ForEach-Object { [Convert]::ToInt32($_,16) } |
        ForEach-Object { [Convert]::ToChar($_) } |
        ForEach-Object { $_ }

    $outputString = $outputArray -join ""

    $outputString
}

"49 02 01 00 00 00 4B 49 02 02 4C 31 54 44 49 02 03 35 32 36 33 49 02 04 35 42 34 37 49 02 05 35 38 38 36" | ConvertFrom-DeviceHexData返回KL1TD52635B475886

对于看似“大规模”的语法和字符串操作不能说太多,但你的代码看起来很干净。