通过HTTP在javascript中发送二进制数据

use*_*509 35 javascript ajax binary hex

我正在尝试将HTTP POST发送到网络上的设备.我想向设备发送四个特定字节的数据,遗憾的是我似乎只能将字符串发送到设备.无论如何使用javascript发送原始二进制文件?

这是我用来执行POST的脚本,除非我在数据字段中放入一个字符串,否则它当前不会运行.有任何想法吗?

(function ($) {
   $.ajax({
      url: '<IP of Address>',
      type: 'POST',
      contentType: 'application/octet-stream',

      //data:'253,0,128,1',
      data:0xFD008001,

      crossDomain: true
   });
})(jQuery);
Run Code Online (Sandbox Code Playgroud)

rai*_*7ow 49

默认情况下,jQuery序列化数据(传入data属性) - 这意味着0xFD008001 数字将作为'4244668417' 字符串(10个字节,而不是4)传递给服务器,这就是服务器不按预期处理它的原因.

有必要通过将$.ajaxproperty 设置processDatafalse:来防止此类行为:

默认情况下,作为对象传入数据选项的数据(技术上,不是字符串)将被处理并转换为查询字符串,适合默认内容类型"application/x-www-form-urlencoded" .如果要发送DOMDocument或其他未处理的数据,请将此选项设置为false.

......但这只是整个故事的一部分:XMLHttpRequest.send实施有其自身的限制.这就是为什么我最好的选择是使用TypedArrays创建自己的序列化程序:

// Since we deal with Firefox and Chrome only 
var bytesToSend = [253, 0, 128, 1],
    bytesArray = new Uint8Array(bytesToSend);

$.ajax({
   url: '%your_service_url%',
   type: 'POST',
   contentType: 'application/octet-stream',  
   data: bytesArray,
   processData: false
});
Run Code Online (Sandbox Code Playgroud)

或者根本不使用jQuery:

var bytesToSend = [253, 0, 128, 1],
    bytesArray = new Uint8Array(bytesToSend);

var xhr = new XMLHttpRequest();
xhr.open('POST', '%your_service_url%');
xhr.setRequestHeader('Content-Type', 'application/octet-stream');
xhr.send(bytesArray);
Run Code Online (Sandbox Code Playgroud)


Mus*_*usa 7

您可以通过带有xhr2的ajax发送二进制数据,您可以将数据作为类型化数组或blob发送.

(function ($) {
   var data = new Uint32Array(1);
   data[0] = 0xFD008001; 
   $.ajax({
      url: '<IP of Address>',
      type: 'POST',
      contentType: false,
      processData: false,
      //data:'253,0,128,1',
      data:data,

      crossDomain: true
   });
})(jQuery);
Run Code Online (Sandbox Code Playgroud)

https://developer.mozilla.org/en-US/docs/Web/API/Uint32Array