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

我试图发送一个HTTP POST到我的networking上的设备。 我想发送四个特定字节的数据到设备,不幸的是我似乎只能发送string到设备。 反正有使用JavaScript发送原始二进制文件?

这里是我用来做POST的脚本,除非我在数据字段中放入一个string,否则它现在不会运行。 有任何想法吗?

(function ($) { $.ajax({ url: '<IP of Address>', type: 'POST', contentType: 'application/octet-stream', //data:'253,0,128,1', data:0xFD008001, crossDomain: true }); })(jQuery); 

默认情况下,jQuery序列化数据(传入data属性) – 这意味着0xFD008001 数字作为'4244668417' string (10字节,而不是4)传递到服务器,这就是为什么服务器对待它不是预期的。

有必要通过将$.ajax属性processData设置为false来防止这种行为:

默认情况下,作为对象传递给数据选项的数据(技术上,除了string以外的任何东西)将被处理并转换为查询string,以适应默认的内容types“application / x-www-form-urlencoded” 。 如果要发送DOMDocument或其他未处理的数据,请将此选项设置为false。

…但这只是整个故事的一部分: XMLHttpRequest.send实现有其自己的限制 。 这就是为什么你最好的select,我想是使用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 }); 

或者完全不使用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); 

您可以通过ajax发送二进制数据与xhr2,您可以发送数据作为一个types的数组或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); 

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

你可以使用atob()btoa()

 var data = new Uint32Array(1); data[0] = 0xFD008001; atob(data) 

这将您的二进制数据转换为可以作为文本发送的base64string。