Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Binary data inside JSON

I'm working with javascript code on the client side of a web site to parse mixed string/raw data, received by means of a JSON object via http POST response.

Some of the fields of that JSON object are texts/numbers, but the biggest and most important field (performance wise) are a raw field composed of raw data (octets).

How do I cast that field to a Float64Array() object, so I can parse the data, using pure modern javascript, with performance in mind?

like image 724
Berk7871 Avatar asked Oct 17 '22 10:10

Berk7871


2 Answers

You can check stackoverflow answer may this help you. Or try to pass raw data in base64 encode in php and decode js for example:-

/ Create Base64 Object
var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f<e.length){n=e.charCodeAt(f++);r=e.charCodeAt(f++);i=e.charCodeAt(f++);s=n>>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9+/=]/g,"");while(f<e.length){s=this._keyStr.indexOf(e.charAt(f++));o=this._keyStr.indexOf(e.charAt(f++));u=this._keyStr.indexOf(e.charAt(f++));a=this._keyStr.indexOf(e.charAt(f++));n=s<<2|o>>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/rn/g,"n");var t="";for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r)}else if(r>127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n<e.length){r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r);n++}else if(r>191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}}

// Define the string
var string = 'Hello World!';

// Encode the String
var encodedString = Base64.encode(string);
console.log(encodedString); // Outputs: "SGVsbG8gV29ybGQh"

// Decode the String
var decodedString = Base64.decode(encodedString);
console.log(decodedString); // Outputs: "Hello World!"

if it doesn't work tell me i will create one example of this functionality HAPPY CODING

like image 56
Shubham Patel Avatar answered Nov 11 '22 18:11

Shubham Patel


For browsers that support it, your best bet for raw performance may be the Encoding API. However, I wasn't able to find any way to make that API support raw binary mixed in among a larger JSON object.

You might also find this answer pertaining to TextEncoder helpful, although due to encoding issues I wasn't able to find any way to apply it directly to this situation.

So with those caveats, the best method I've been able to find so far for this particular situation is to just manually read the string into an ArrayBuffer and then view it as a FloatArray, based on this Google blog post:

function stringToFloat64Array(str) {
  var buffer = new ArrayBuffer(str.length); // 1 byte per char
  var view = new Uint8Array(buffer);
  for (var i=str.length-1; i>=0; i--) {
    view[i] = str.charCodeAt(i);
  }
  return new Float64Array(buffer, 0, str.length / 8); // 8 bytes per float
}

var json = {
   "somenumber": 3,
   "raw": "\x66\x66\x66\x66\x66\x66\x14\x40\x00\x00\x00\x00\x00\x00\x00\xc0"
}; // From JSON.parse
var floatArray = stringToFloat64Array(json.raw);
console.log(floatArray); // Float64Array [ 5.1, -2 ]
like image 23
Flight Odyssey Avatar answered Nov 11 '22 18:11

Flight Odyssey