简体   繁体   中英

Convert UInt8Array to String

I'm working on an application involving cryptocurrency, and I'm having trouble with handling the conversion of some of the data involved.

I'm using bitcoinjs-lib to generate Bitcoin addresses. The addresses are created successfully, and my response object looks like the following:

address: "1Nnn9HpxgykWXxZX5rL3hIH7iikWkQaBSc"
balance: 0
currency: "BTC"
privateKey: Uint8Array(32) [86, 201, 0, 216, 118, 231, 201, 251, 161, 22, 223, 14, 234, 229, 168, 146, 41, 121, 182, 136, 176, 120, 185, 173, 181, 47, 228, 244, 107, 230, 29, 27]
publicKey: Uint8Array(33) [3, 233, 119, 81, 11, 119, 13, 133, 115, 183, 163, 90, 218, 2, 36, 41, 105, 158, 248, 131, 68, 234, 193, 110, 105, 72, 38, 110, 253, 192, 245, 108, 214]
wif: "Kz8QjBvSPjfRVxazJDwGEGwaoGTjRhFGe1MPsiPZRPpKEpidH7Qf"

I'm using an IndexedDB to store the created wallets. Since I'm generating different types of wallets, my database call looks like this:

{
 date: new Date(),
 coinType: crypto,
 isHDWallet: true,
 derivationPath: null,
 publicKey: bytesToString(Buffer.from(wallet.publicKey)) ?? null,
 privateKey: bytesToString(Buffer.from(wallet.privateKey)) ?? null,
 wif: wallet.wif ?? null,
 address: wallet.address ?? null,
 balance: wallet.balance ?? null,
 secret: wallet.secret ?? null,
 user_id: 1
}

My data is stored in my database just fine, except I can't correctly translate the UInt8Array into a string. I've tried nearly everything from this post , but have not had any success.

Here is the bytesToString function that I tried:

function bytesToString (bytes) {
        return String.fromCharCode.apply(null, bytes)
      }

I tried using Node's StringDecoder module with no success. I've also tried using Buffer.from(privateKey).toString('utf-8') .

I've read that Bitcoin addresses use a base 58 encoding. I don't know if that's relevant or not.

I don't have any experience using buffers, or with any type of conversion like this. Any help would be greatly appreciated.

This is not UTF-8 encoded text, but just binary data. So you can forget about the linked Q/A, you are not in the same situation.

Here it's all your choice as to how you'll encode it, some will prefer to convert it to an hex-dump

 const arr = new Uint8Array([86, 201, 0, 216, 118, 231, 201, 251, 161, 22, 223, 14, 234, 229, 168, 146, 41, 121, 182, 136, 176, 120, 185, 173, 181, 47, 228, 244, 107, 230, 29, 27]); const as_text = Array.from( arr ).map( (val) => val.toString( 16 ).padStart( 2,"0" ) ).join(" "); console.log( as_text );

some will prefer to store it as base64:

 const arr = new Uint8Array([86, 201, 0, 216, 118, 231, 201, 251, 161, 22, 223, 14, 234, 229, 168, 146, 41, 121, 182, 136, 176, 120, 185, 173, 181, 47, 228, 244, 107, 230, 29, 27]); const bin = []; for (let i = 0; i < arr.length; i++) { bin.push( String.fromCharCode( arr[ i ] ) ); } const as_text = btoa( bin.join( "" ) ); console.log( as_text );

some might prefer to store the binary data directly as TINYBLOB, though I'm really no expert in DB maintenance.

It is just a binary data. If you want to convert it to string. I suggest you to use Base64. You can use a third-party library: https://github.com/dankogai/js-base64 .

Base64.fromUint8Array(arr);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM