使用 javascript 将 Base64 解码为十六进制字符串

IT技术 javascript base64 hex
2021-02-20 06:48:39

需要使用 javascript 将 Base64 字符串转换为十六进制。

例子:

var base64Value = "oAAABTUAAg=="

需要转换方法

输出(解码数据(十六进制)) A0000005350002

我知道这是正确的,因为我可以使用这个网站http://tomeko.net/online_tools/base64.php?lang=en

并打入 Base64 字符串 oAAABTUAAg== 并得到A0000005350002

我试过什么?

https://github.com/carlo/jquery-base64
https://jsfiddle.net/gabrieleromanato/qaght/

我发现了很多问题

5个回答

为什么不试试下面的代码?:

const buffer = Buffer.from(rawData, 'base64');
const bufString = buffer.toString('hex');
这不仅更清晰,而且这是节点后端代码的正确答案,因为没有 npm module就无法使用 atob。
2021-04-23 06:48:39

atob() 然后 charCodeAt() 会给你二进制 & toString(16) 会给你十六进制。

function base64ToHex(str) {
  const raw = atob(str);
  let result = '';
  for (let i = 0; i < raw.length; i++) {
    const hex = raw.charCodeAt(i).toString(16);
    result += (hex.length === 2 ? hex : '0' + hex);
  }
  return result.toUpperCase();
}

console.log(base64ToHex("oAAABTUAAg=="));

这是使用 es6 反转的单行: hexToB64 = hex => btoa(String.fromCharCode(...Array.apply(null, Array(hex.length / 2)).map((_,i) => parseInt (hex[i*2] + hex[i*2+1],16))))
2021-04-22 06:48:39
对于节点用户 - var raw = new Buffer(base64, 'base64').toString('binary');
2021-05-17 06:48:39
在节点 10 中获取十六进制:Buffer.from(base64, 'base64').toString('hex')
2021-05-17 06:48:39

假设您希望十六进制表示为字符串,则该window.atob函数(在大多数现代浏览器中可用)是您的第一步 - 它会将您的 base64 字符串转换为 ASCII 字符串,其中每个字符代表一个字节。

此时,您拆分字符串,获取每个字符的字符代码,然后将转换为左填充的 base-16 字符串。

function base64ToBase16(base64) {
  return window.atob(base64)
      .split('')
      .map(function (aChar) {
        return ('0' + aChar.charCodeAt(0).toString(16)).slice(-2);
      })
     .join('')
     .toUpperCase(); // Per your example output
}

console.log(base64ToBase16("oAAABTUAAg==")); // "A0000005350002"

(或者在 JSBin 上试试)

这是我的原版 JavaScript 解决方案,它不使用atobBuffer支持separator,适用于二进制数据和React Native,性能比较高。

用法 :

base64ToHex( 'MTIzYWJjIDotKQ==', '-' )
// returns '31-32-33-61-62-63-20-3a-2d-29'

代码 :

/* Convert base64 data to hex string.  https://stackoverflow.com/a/57909068/893578
 *   txt : Base64 string.
 *   sep : Hex separator, e.g. '-' for '1a-2b-3c'.  Default empty.
 */
const base64ToHex = ( () => {
   // Lookup tables
   const values = [], output = [];

   // Main converter
   return function base64ToHex ( txt, sep = '' ) {
      if ( output.length <= 0 ) populateLookups();
      const result = [];
      let v1, v2, v3, v4;
      for ( let i = 0, len = txt.length ; i < len ; i += 4 ) {
         // Map four chars to values.
         v1 = values[ txt.charCodeAt( i   ) ];
         v2 = values[ txt.charCodeAt( i+1 ) ];
         v3 = values[ txt.charCodeAt( i+2 ) ];
         v4 = values[ txt.charCodeAt( i+3 ) ];
         // Split and merge bits, then map and push to output.
         result.push(
            output[ ( v1 << 2) | (v2 >> 4) ],
            output[ ((v2 & 15) << 4) | (v3 >> 2) ],
            output[ ((v3 &  3) << 6) |  v4 ]
         );
      }
      // Trim result if the last values are '='.
      if ( v4 === 64 ) result.splice( v3 === 64 ? -2 : -1 );
      return result.join( sep );
   };

   function populateLookups () {
      const keys = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
      for ( let i = 0 ; i < 256 ; i++ ) {
         output.push( ( '0' + i.toString( 16 ) ).slice( -2 ) );
         values.push( 0 );
      }
      for ( let i = 0 ; i <  65 ; i++ )
         values[ keys.charCodeAt( i ) ] = i;
   }
} )();

演示:

注意:这是为geisterfurz007完成的,因为react-native-fs为二进制文件生成 base64,并且他需要将其转换为十六进制字符串。并不是说我对现有片段的效率感到满意......

尝试

[...atob(base64Value)].map(c=> c.charCodeAt(0).toString(16).padStart(2,0))