あのぞんブログ

Buffer と float、整数、他エンコードとの相互変換【Javascript】

2020-11-01

JavaScript で Buffer と他の型への変換する方法をまとめました。

repl も公開しています。 Repl.it - buffer

数値 → Buffer

数値は → 型付き配列 → Buffer という順に変換する。

// int → Buffer
const intBuf = Buffer.from(new Uint8Array([120]).buffer)
// float → Buffer
const floatBuf = Buffer.from(new Float32Array([1.23]).buffer)
// double → Buffer
const doubleBuf = Buffer.from(new Float64Array([1.2345]).buffer)

Buffer → 数値

// Buffer → int
const int = intBuf.readInt8(0)
// Buffer → float
const float = floatBuf.readFloatLE(0)
// Buffer → double
const double = doubleBuf.readDoubleLE(0)

// { int: 120, float: 1.2300000190734863, double: 1.2345 }

文字列 ↔ Buffer

一番シンプル。

// string → Buffer
const strBuf = Buffer.from('かぼちゃ')
// <Buffer e3 81 8b e3 81 bc e3 81 a1 e3 82 83>

// string → Buffer
strBuf.toString()
// かぼちゃ

他のエンコーディング ↔ Buffer

// かぼちゃ Buffer → 各エンコード

strBuf.toString('hex')
// e3818be381bce381a1e38283
strBuf.toString('base64')
// 44GL44G844Gh44KD
strBuf.toString('utf8')
// かぼちゃ
strBuf.toString('utf16le')
// 臣벁臣莂

// 各エンコード → Buffer
Buffer.from('e3818be381bce381a1e38283', 'hex')
Buffer.from('44GL44G844Gh44KD', 'base64')
Buffer.from('かぼちゃ', 'utf8')
Buffer.from('臣벁臣莂', 'utf16le')
// <Buffer e3 81 8b e3 81 bc e3 81 a1 e3 82 83>

他の数値型について

例に上げた Uint8Float32 の他にも種類があり、“サイズ(バイト数)”, “符号の有無” により複数あります。 適したものを使いましょう。

from buffer Buffer | Node.js v15.0.1 Documentation

to buffer JavaScript 型付き配列 - JavaScript | MDN

変換例

base64 エンコード文字を Dobule 型に戻す例。 (base64 ↔ Buffer ↔ Double)

Buffer.from(new Float64Array([321.123]).buffer).toString('base64')
// 'hxbZzvcRdEA='
Buffer.from('hxbZzvcRdEA=', 'base64').readDoubleLE()
// 321.123

hex エンコードを int に戻す。 (hex ↔ Buffer ↔ int)

Buffer.from(new Int32Array([20201010]).buffer).toString('hex')
// '323e3401'
Buffer.from('323e3401', 'hex').readInt32LE(0)
// 20201010

範囲を間違えると別の値になる

当然ですが書き込んだ形式と別の読み出し型をすると別の値になっていまします。

const b1 = Buffer.from(new Uint32Array([1234]).buffer)
b1.readInt32LE(0)
// o 1234
b1.readInt32BE(0)
// x -771489792 エンディアン間違い
b1.readInt8(0)
// x -46 Byte長 間違い

変換時の値の範囲が間違えていても同様です。

const b2 = Buffer.from(new Uint8Array([-10]).buffer)
// 範囲ミス Unsigned なのにマイナス
b2.readUInt8(0)
// x 246

const b3 = Buffer.from(new Uint16Array([65536]).buffer)
// 範囲ミス 65535 より大きい値
b3.readUInt16LE(0)
// x 0

anozon JavaScript とアニメ好き Web エンジニア。Twitter

© 2020 あのぞんびより All Rights Reserved