我在Powershell中解码base64字符串时遇到一个奇怪的问题。
$url = "https://*******.search.windows.net/indexes/azureblob-index/docs?api-version=2019-05-06&search=*"
$headers = @{
"api-version" = "2019-05-06"
"Content-Type" = "application/json"
"api-key" = "**********"
}
$result = Invoke-webrequest -Uri $url -Headers $headers -Method Get | ConvertFrom-Json
$values = $result.value
foreach ($value in $values)
{
$path = $value.metadata_storage_path
$bloburl = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($path))
$bloburl
}
显然,****隐藏了敏感信息。
因此,我尝试返回已编码的Azure Blob URL。它设法解码,但是返回并出错,似乎在URL的末尾添加了一个字符-使它与base64解码期望的不同步。
结果看起来像这样-
https://*******.blob.core.windows.net/files/REPORTS/*****/SEISMIC_ACQUISITION/ACQUISITION_REPORT_APPENDIX4_DAY_LOGS_JD_201.pdf5
总是在字符串末尾添加数字5。
关于这里发生的事情有什么想法吗?
这是完整的代码-没有其他事情了。
所发生的全部操作是将搜索查询发送到Azure搜索,并返回与搜索查询匹配的Blob /文档的url。 Azure返回base64字符串,我想将其解码为纯文本。
错误是:
Exception calling "FromBase64String" with "1" argument(s): "Invalid length for a Base-64 char array or string."
At line:25 char:9
+ $bloburl = [System.Text.Encoding]::UTF8.GetString([System.Con ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : FormatException
它发生在从base64转换的那一行。
metadata_storage_path
“ base64编码”值显然是base64的mangled版本,其中删除了所有尾随的“ =”,并在其中放置了一个数字,指示删除了多少“ =”。这是为了允许在URL中使用base64字符串更简单。
请参阅此问题以获取更多详细信息:
How to decode metadata_storage_path produced by Azure Search indexer in .NET Core
您需要补偿此修改,才能返回有效的base64编码字符串,然后才能对其进行解码。链接的答案为执行此操作提供了一些选项。