使用Big endian的Int(或short)到字节数组

时间:2014-02-09 17:19:11

标签: javascript arrays endianness

我正在尝试使用通用函数将整数,短整数和其他函数转换为字节数组,反之亦然,所有这些都使用每个值的预定义字节数。

编码功能似乎是正确的。它看起来像这样:

  /**Parameters:
     data - string, every `bytes` bytes will form one number entry
     array - the output array refference where numbers will be put
     bytes - number of bytes per entry
     big_endian - use big endian? (little endian otherwise)
  */
  function fromBytes(data, array, bytes, big_endian) {
    //Temporary variable for current number
    var num;
    //Loop through byte array
    for(var i=0, l=data.length; i<l; i+=bytes) {
      num=0;
      //Jump through the `bytes` and add them to number
      if(big_endian) {
        for(var b=0; b<bytes; b++) {
          num+=(num << 8)+data.charCodeAt(i+b);
        }
      }
      else {
        for(var b=bytes-1; b>=0; b--) {
          num+=(num << 8)+data.charCodeAt(i+b);
        }
      }
      //Add decomposed number to an array
      array.push(num);
    }
    return array;
  }

如果出现问题请告诉我。

现在,编码函数对于小端看起来很容易 - 我只需要number%255然后将数字除以255(并重复该数字)。 但是我不确定如何用big endian编码数字 - 如何获得最大的部分?

这是我缺少部分的功能:

  /**Parameters:
     array - arrau of numbers to encode
     bytes - number of bytes per entry
     big_endian - use big endian? (little endian otherwise)
  */
function toBytes(array, bytes, big_endian) {

    //The produced string
    var data = "";
    //last retrieved number
    var num;
    //Loop through byte array
    for(var i=0, l=array.length; i<l; i++) {
      num = array[i];
      if(big_endian) {
        /** ??? **/
      }
      else {
        for(var b=bytes-1; b>=0; b--) {
          data+=String.fromCharCode(num%255);
          num = Math.floor(num/255);
        }      
      }
      //Add decomposed number to an array
      array.push(num);
    }
    return array;
  }

小端转换有效。你能给我一个线索,如何使用Big endian将int,short或double编码为4,2或8个字节?

0 个答案:

没有答案