解码 base64 字符串在 JS 中不起作用,适用于 Linux' base64
Decoding base64 string doesn't work in JS, works with Linux' base64
我有一个 Playready DRM 清单,正在从中提取 base64 编码 header,这部分工作正常。
但是,当我尝试通过 atob
或此处提供的其他 copy-paste 实现之一解码 Javascript (client-side) 中的字符串时,有每个预期字符之间的空白 missing-character 方块。
如果我将编码后的字符串通过管道传输到终端中的 base64 --decode
,我会得到预期的输出。
Base64编码字符串:0gIAAAEAAQDIAjwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAD4AMQBpAHQASAAyAFIAaQAwAHMAawBXAC8AVgA3AHUAZwBZAGgALwA0AGgAZwA9AD0APAAvAEsASQBEAD4APABDAEgARQBDAEsAUwBVAE0APgBoAHUANgBOAFMAZABnADQAWAAyAFUAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APABMAEEAXwBVAFIATAA+AGgAdAB0AHAAcwA6AC8ALwBsAGkAYwAuAHMAdABhAGcAaQBuAGcALgBkAHIAbQB0AG8AZABhAHkALgBjAG8AbQAvAGwAaQBjAGUAbgBzAGUALQBwAHIAbwB4AHkALQBoAGUAYQBkAGUAcgBhAHUAdABoAC8AZAByAG0AdABvAGQAYQB5AC8AUgBpAGcAaAB0AHMATQBhAG4AYQBnAGUAcgAuAGEAcwBtAHgAPAAvAEwAQQBfAFUAUgBMAD4APAAvAEQAQQBUAEEAPgA8AC8AVwBSAE0ASABFAEEARABFAFIAPgA=
base64 -decode
输出:��<WRMHEADER xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader" version="4.0.0.0"><DATA><PROTECTINFO><KEYLEN>16</KEYLEN><ALGID>AESCTR</ALGID></PROTECTINFO><KID>1itH2Ri0skW/V7ugYh/4hg==</KID><CHECKSUM>hu6NSdg4X2U=</CHECKSUM><LA_URL>https://lic.staging.drmtoday.com/license-proxy-headerauth/drmtoday/RightsManager.asmx</LA_URL></DATA></WRMHEADER>
Javascript 输出:҂����Ȃ<�W�R�M�H�E�A�D�E�R� �x�m�l�n�s�=�"�h�t�t�p�:�/�/�s�c�h�e�m�a�s�.�m�i�c�r�o�s�o�f�t�.�c�o�m�/�D�R�M�/�2�0�0�7�/�0�3�/�P�l�a�y�R�e�a�d�y�H�e�a�d�e�r�"� �v�e�r�s�i�o�n�=�"�4�.�0�.�0�.�0�"�>�<�D�A�T�A�>�<�P�R�O�T�E�C�T�I�N�F�O�>�<�K�E�Y�L�E�N�>�1�6�<�/�K�E�Y�L�E�N�>�<�A�L�G�I�D�>�A�E�S�C�T�R�<�/�A�L�G�I�D�>�<�/�P�R�O�T�E�C�T�I�N�F�O�>�<�K�I�D�>�1�i�t�H�2�R�i�0�s�k�W�/�V�7�u�g�Y�h�/�4�h�g�=�=�<�/�K�I�D�>�<�C�H�E�C�K�S�U�M�>�h�u�6�N�S�d�g�4�X�2�U�=�<�/�C�H�E�C�K�S�U�M�>�<�L�A�_�U�R�L�>�h�t�t�p�s�:�/�/�l�i�c�.�s�t�a�g�i�n�g�.�d�r�m�t�o�d�a�y�.�c�o�m�/�l�i�c�e�n�s�e�-�p�r�o�x�y�-�h�e�a�d�e�r�a�u�t�h�/�d�r�m�t�o�d�a�y�/�R�i�g�h�t�s�M�a�n�a�g�e�r�.�a�s�m�x�<�/�L�A�_�U�R�L�>�<�/�D�A�T�A�>�<�/�W�R�M�H�E�A�D�E�R�>�
有谁知道为什么会这样或如何解决这个问题?我假设它是字符集,但尝试其他字符集会产生类似的结果。
编辑
SO 已正确显示 Javascript output 字符串(即它在我的程序中应该如何显示)所以也许我没有正确转义它或其他什么?第一次贴的时候小编是这样给我看的:
编辑 2
第一次编辑后,SO 现在再次显示奇怪的字符...
您的数据似乎是使用 BOM 编码的 UTF-16。
使用 UTF-16 to UTF-8 conversion in JavaScript 中的函数,您似乎可以使用
以 UTF-8/ASCII 格式获取数据
decodeUTF16LE(atob(yourString)).slice(5) // .slice(5) = remove BOM
我有一个 Playready DRM 清单,正在从中提取 base64 编码 header,这部分工作正常。
但是,当我尝试通过 atob
或此处提供的其他 copy-paste 实现之一解码 Javascript (client-side) 中的字符串时,有每个预期字符之间的空白 missing-character 方块。
如果我将编码后的字符串通过管道传输到终端中的 base64 --decode
,我会得到预期的输出。
Base64编码字符串:0gIAAAEAAQDIAjwAVwBSAE0ASABFAEEARABFAFIAIAB4AG0AbABuAHMAPQAiAGgAdAB0AHAAOgAvAC8AcwBjAGgAZQBtAGEAcwAuAG0AaQBjAHIAbwBzAG8AZgB0AC4AYwBvAG0ALwBEAFIATQAvADIAMAAwADcALwAwADMALwBQAGwAYQB5AFIAZQBhAGQAeQBIAGUAYQBkAGUAcgAiACAAdgBlAHIAcwBpAG8AbgA9ACIANAAuADAALgAwAC4AMAAiAD4APABEAEEAVABBAD4APABQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsARQBZAEwARQBOAD4AMQA2ADwALwBLAEUAWQBMAEUATgA+ADwAQQBMAEcASQBEAD4AQQBFAFMAQwBUAFIAPAAvAEEATABHAEkARAA+ADwALwBQAFIATwBUAEUAQwBUAEkATgBGAE8APgA8AEsASQBEAD4AMQBpAHQASAAyAFIAaQAwAHMAawBXAC8AVgA3AHUAZwBZAGgALwA0AGgAZwA9AD0APAAvAEsASQBEAD4APABDAEgARQBDAEsAUwBVAE0APgBoAHUANgBOAFMAZABnADQAWAAyAFUAPQA8AC8AQwBIAEUAQwBLAFMAVQBNAD4APABMAEEAXwBVAFIATAA+AGgAdAB0AHAAcwA6AC8ALwBsAGkAYwAuAHMAdABhAGcAaQBuAGcALgBkAHIAbQB0AG8AZABhAHkALgBjAG8AbQAvAGwAaQBjAGUAbgBzAGUALQBwAHIAbwB4AHkALQBoAGUAYQBkAGUAcgBhAHUAdABoAC8AZAByAG0AdABvAGQAYQB5AC8AUgBpAGcAaAB0AHMATQBhAG4AYQBnAGUAcgAuAGEAcwBtAHgAPAAvAEwAQQBfAFUAUgBMAD4APAAvAEQAQQBUAEEAPgA8AC8AVwBSAE0ASABFAEEARABFAFIAPgA=
base64 -decode
输出:��<WRMHEADER xmlns="http://schemas.microsoft.com/DRM/2007/03/PlayReadyHeader" version="4.0.0.0"><DATA><PROTECTINFO><KEYLEN>16</KEYLEN><ALGID>AESCTR</ALGID></PROTECTINFO><KID>1itH2Ri0skW/V7ugYh/4hg==</KID><CHECKSUM>hu6NSdg4X2U=</CHECKSUM><LA_URL>https://lic.staging.drmtoday.com/license-proxy-headerauth/drmtoday/RightsManager.asmx</LA_URL></DATA></WRMHEADER>
Javascript 输出:҂����Ȃ<�W�R�M�H�E�A�D�E�R� �x�m�l�n�s�=�"�h�t�t�p�:�/�/�s�c�h�e�m�a�s�.�m�i�c�r�o�s�o�f�t�.�c�o�m�/�D�R�M�/�2�0�0�7�/�0�3�/�P�l�a�y�R�e�a�d�y�H�e�a�d�e�r�"� �v�e�r�s�i�o�n�=�"�4�.�0�.�0�.�0�"�>�<�D�A�T�A�>�<�P�R�O�T�E�C�T�I�N�F�O�>�<�K�E�Y�L�E�N�>�1�6�<�/�K�E�Y�L�E�N�>�<�A�L�G�I�D�>�A�E�S�C�T�R�<�/�A�L�G�I�D�>�<�/�P�R�O�T�E�C�T�I�N�F�O�>�<�K�I�D�>�1�i�t�H�2�R�i�0�s�k�W�/�V�7�u�g�Y�h�/�4�h�g�=�=�<�/�K�I�D�>�<�C�H�E�C�K�S�U�M�>�h�u�6�N�S�d�g�4�X�2�U�=�<�/�C�H�E�C�K�S�U�M�>�<�L�A�_�U�R�L�>�h�t�t�p�s�:�/�/�l�i�c�.�s�t�a�g�i�n�g�.�d�r�m�t�o�d�a�y�.�c�o�m�/�l�i�c�e�n�s�e�-�p�r�o�x�y�-�h�e�a�d�e�r�a�u�t�h�/�d�r�m�t�o�d�a�y�/�R�i�g�h�t�s�M�a�n�a�g�e�r�.�a�s�m�x�<�/�L�A�_�U�R�L�>�<�/�D�A�T�A�>�<�/�W�R�M�H�E�A�D�E�R�>�
有谁知道为什么会这样或如何解决这个问题?我假设它是字符集,但尝试其他字符集会产生类似的结果。
编辑
SO 已正确显示 Javascript output 字符串(即它在我的程序中应该如何显示)所以也许我没有正确转义它或其他什么?第一次贴的时候小编是这样给我看的:
编辑 2 第一次编辑后,SO 现在再次显示奇怪的字符...
您的数据似乎是使用 BOM 编码的 UTF-16。 使用 UTF-16 to UTF-8 conversion in JavaScript 中的函数,您似乎可以使用
以 UTF-8/ASCII 格式获取数据decodeUTF16LE(atob(yourString)).slice(5) // .slice(5) = remove BOM