programing

HTTP를 통해 javascript로 바이너리 데이터 전송

newsource 2023. 3. 1. 11:12

HTTP를 통해 javascript로 바이너리 데이터 전송

네트워크상의 디바이스에 HTTP POST 를 송신하려고 합니다.디바이스에 특정 4바이트의 데이터를 송신하고 싶은데, 디바이스에는 문자열밖에 송신할 수 없는 것 같습니다.javascript를 사용하여 raw binary를 보낼 수 있는 방법이 있습니까?

POST를 실행하기 위해 사용하는 스크립트는 다음과 같습니다.데이터 필드에 문자열을 입력하지 않으면 현재 실행되지 않습니다.좋은 생각 있어요?

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

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

      crossDomain: true
   });
})(jQuery);

기본적으로 jQuery는 데이터를 직렬화합니다(통과).dataproperty) - 즉,0xFD008001 번호는 '4244668417' 문자열(4바이트가 아닌 10바이트)로 서버에 전달되기 때문에 서버에서 예상대로 처리되지 않습니다.

이러한 동작을 방지하려면 다음을 설정해야 합니다.$.ajax소유물processData로.false:

기본적으로는 데이터 옵션에 개체로 전달된 데이터(기술적으로는 문자열 이외)는 처리되어 쿼리 문자열로 변환되며 기본 컨텐츠 유형인 "application/x-www-form-urlencoded"에 적합합니다.DOMDocument 또는 기타 처리되지 않은 데이터를 보내려면 이 옵션을 false로 설정하십시오.

...하지만 그것은 전체 이야기의 일부에 불과합니다.XMLHttpRequest.send에는 독자적인 제약사항이 있습니다.그렇기 때문에 Type Arrays를 사용하여 직접 시리얼라이저를 만드는 것이 최선이라고 생각합니다.

// 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);

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);

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

다음과 같이 ArrayBuffer 유형의 데이터를 ArrayBufferView로 변환할 수 있습니다.

var fileContent = new DataView(<ArrayBuffer_data>);

이렇게 하면 fileContent를 전송할 때 콘솔에 경고가 표시되지 않습니다.

사용할 수 있습니다.atob()그리고.btoa():

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

그러면 이진 데이터가 텍스트로 전송될 수 있는 base64 문자열로 변환됩니다.

언급URL : https://stackoverflow.com/questions/19959072/sending-binary-data-in-javascript-over-http