3

需要帮助将文本文件中包含的所有十六进制字符转换为字符串或 ASCII。十六进制字符以标准格式出现

user1 domain1 7374726f6e6770617373776f7264403130                                               
user2 domain2 7374726f6e6770617373776f7264403120

转换后应显示为

user1 domain1 strongpassword@10

文本文件包含多个密码,全部排成一行

4

7 回答 7

4

像这样:

$h =  7374726f6e6770617373776f7264403130

-join ($h -split '(..)' | ? { $_ } | % { [char][convert]::ToUInt32($_,16) })
于 2013-06-21T08:13:08.570 回答
2
Get-Content file.txt | Foreach-Object{

    $user,$domain,$pass = $_.Split()

    $pass = for($i=0; $i -lt $pass.length; $i+=2)
    {
       [char][int]::Parse($pass.substring($i,2),'HexNumber')
    }

    $user,$domain,(-join $pass) -join ' '
}
于 2013-06-21T11:52:29.167 回答
1

以此为例说明如何做到这一点:

$text = 'user1 domain1 7374726f6e6770617373776f7264403130'
$p = [Regex]::Match($text, '\w+$').Value
$pass = ((0..(($p.length - 1) / 2) | % {[Char]([Convert]::toint16($p.SubString($_ * 2, 2), 16))}) -Join '')
$text = $text -Replace '\w+$', $pass
$text
于 2013-06-21T08:08:06.740 回答
1
$pass=""
$t="7374726f6e6770617373776f7264403130"
$t -split '(.{2})' |%{ if ($_ -ne "") { $pass+=[CHAR]([CONVERT]::toint16("$_",16))  }}
write host $pass
于 2013-06-21T08:24:03.790 回答
1
$IN="SOME LONG CRAZY STRING TO CONVERT TO HEX"

$HEX = $(($IN | Format-Hex).ToString().Split("`n")).ForEach({ $_.remove(0,11) -replace '[ ]{2,}.*$','' }).Split() -join ''

Write-Host $HEX

$OUT = $($HEX -split '(.{2})').ForEach({ if ($_ -ne "") { [CHAR]([CONVERT]::toint16("$_",16)) } }) -join ''

Write-Host $OUT
于 2018-10-19T04:13:42.863 回答
0

第一个响应是唯一返回带有十六进制解码的用户、域和密码的行的响应。

第二个响应是最优雅的 Perl。

这是两者的组合:

[regex]$regEx = '(\S+)$';
$scriptBlock = { param ($match); -join ( $match.Groups[1].Value -split '(..)' | ? { $_; } | % { [Char]( [Convert]::ToInt16($_, 16) ); } ); }
Get-Content file.txt | % { $regEx.Replace($_, $scriptBlock); }

可以对脚本块进行格式化以提高可读性,而不是简洁/类似 Perl 的混淆。:)

$scriptBlock = { 
    param ($match); 
    -join ( 
        $match.Groups[1].Value -split '(..)' | ? { $_; } | % { 
            [Char]( [Convert]::ToInt16($_, 16) ); 
        } 
    ); 
};
于 2013-10-03T05:31:37.737 回答
0

另一种选择。这样做的好处是为您提供了一个可以使用 Format-Table 查看或使用 Export-Csv 导出的对象。此外,这里的 ConvertForm-Hexadecimal 实现非常快,即使处理非常大的字符串也能很好地工作。

function ConvertFrom-Hexadecimal([string] $hexString)
{
    [byte[]] $data = @()

    if ([string]::IsNullOrEmpty($hexString) -eq $true -or $hexString.Length % 2 -ne 0)
    {
        throw New-Object FormatException("Hexadecimal string must not be empty and must contain an even number of digits to be valid.");
    }

    $hexString = $hexString.ToUpperInvariant()
    $data = New-Object byte[] -ArgumentList ($hexString.Length / 2)

    for ([int] $index = 0; $index -lt $hexString.Length; $index += 2)
    {
        [int] $highDigitValue = if ($hexString[$index] -le ([char] '9')) { $hexString[$index] - ([char] '0') } else { $hexString[$index] - ([char] 'A') + 10 }
        [int] $lowDigitValue = if ($hexString[$index + 1] -le ([char] '9')) { $hexString[$index + 1] - ([char] '0') } else { $hexString[$index + 1] - ([char] 'A') + 10 }

        if ($highDigitValue -lt 0 -or $lowDigitValue -lt 0 -or $highDigitValue -gt 15 -or $lowDigitValue -gt 15)
        {
            throw New-Object FormatException("An invalid digit was encountered. Valid hexadecimal digits are 0-9 and A-F.")
        }
        else
        {
            [byte] $value = [byte](($highDigitValue -shl 4) -bor ($lowDigitValue -band 0x0F))
            $data[$index / 2] = $value;
        }
    }

    return ,$data
}

$fileName = '.\testfile.txt'

$passwordColumn = @{ name = 'Password'; expression = { $bytes = ConvertFrom-Hexadecimal $_.EncodedPassword; [System.Text.Encoding]::ASCII.GetString($bytes); } }
$users = Import-Csv -Delimiter ' ' -Header User, Domain, EncodedPassword -Path $fileName | Select *, $passwordColumn
$users | ft -AutoSize
于 2017-03-17T22:44:02.537 回答