【发布时间】:2019-11-22 11:16:17
【问题描述】:
我在 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 转换的那一行。
【问题讨论】:
-
所以听起来 web-request 响应返回的字符串不是有效的 Bae64 编码字符串,或者,正如结果所示,它可能包含的不仅仅是这样的字符串。文档对这些数据的格式有什么看法?除了无关的
5之外,返回的 URL 是您所期望的吗? -
当我使用在线 base64 解码器时,我得到了预期的 URL,因此它在转换时似乎在某处出现错误。有趣的是,如果我在转换之前将“=”添加到字符串的末尾,它会更正输出 URL,但随后会为我正在转换的其他字符串抛出相同的“无效长度”错误。它是如此随机。一个错误?
-
结果是否包含非 ASCII 字符?会不会是字符编码问题(Invoke-WebRequest 误解了源编码)?
-
您能否创建一个表现出相同行为的非敏感实例并针对此发布
Invoke-webrequest -Uri $url -Headers $headers -Method Get的原始结果?使用示例响应来诊断问题会更容易...... -
另外,您可以尝试将 expected 值转换回 base64 并查看是否得到与 api 返回的相同的 base64 字符串 - 这可能会提供有关差异...
标签: azure powershell search encoding base64