代码之家  ›  专栏  ›  技术社区  ›  Dimitrios Desyllas

将十六进制字符串转换为二进制数据并转换为缓冲区

  •  1
  • Dimitrios Desyllas  · 技术社区  · 6 年前

    有时,从网络传输/USDB设备接收的数据有一个六进制字符串,例如:

    “12ADFF1345”

    我希望以某种方式将这些类型的字符串转换为二进制等价物,以便对它们执行一些数学或二进制操作。

    你知道我怎样才能做到吗?

    2 回复  |  直到 6 年前
        1
  •  2
  •   corn3lius    6 年前

    使用内置 Buffer 班级:

    let buf1 = Buffer.from('12ADFF1345', 'hex');
    
    let value = buf1.readInt32LE(0);
    let value2 = buf1.readInt16LE(2);
    console.log(value,value2);
    
    
    >> 335523090 5119
    // '13ffad12' '13FF' (LE) 
    >> 313392915 -237
    // '12ADFF13' 'ff13' (BE)
    

    https://nodejs.org/api/buffer.html#buffer_class_method_buffer_from_string_encoding

        2
  •  0
  •   Dimitrios Desyllas    6 年前

    是的,我知道怎么做,算法很简单(假设您没有转义字符):

    1. 将读取字符串拆分为一个字符。
    2. 对每个字符对进行分组。
    3. 然后生成字符串 0x^first_character_pair^
    4. 以16为基数分析上面的字符串

    换句话说,请参考以下代码:

    const hexStringToBinaryBuffer = (string) => {
      const subStrings = Array.from(string);
      let previous = null;
      const bytes = [];
      _.each(subStrings, (val) => {
        if (previous === null) { // Converting every 2 chars as binary data
          previous = val;
        } else {
          const value = parseInt(`0x${previous}${val}`, 16);
          bytes.push(value);
          previous = null;
        }
      });
    
      return Buffer.from(bytes);
    };
    

    如果您将 Buffer.toString('hex') 或通过网络插座或USB端口的等效方法,另一端接收。

    推荐文章