2016-09-15 8 views
0

2 개의 기존 arrayBuffers를 2 개의 파트로 결합해야합니다.자바 스크립트 결합 ArrayBuffer 파트

파서를 작성 중이며 데이터가 임의 크기의 arraybuffer로 제공되고 데이터가 하나의 끝에 걸쳐 다른 하나의 시작 부분으로 유출됩니다. 그래서 새로운 출력 버퍼를 만들고 한 버퍼의 끝 부분과 다른 버퍼의 시작 부분에 복사해야합니다. 출력은 Arraybuffer가됩니다.

이 데모부터 시작하여 Uint8Arrays를 일부 오프셋과 함께 사용하여 세트를 사용하려고했지만 특정 조합은 Invalid typed array length을 던졌습니다. 각 배열 또는 오프셋의 길이를 미리 알 수 없습니다.

var buffer1 = new ArrayBuffer(8); 
var buffer2 = new ArrayBuffer(8); 
var buffer3 = new ArrayBuffer(8); 

var uint8_1 = new Uint8Array(buffer1); 
var uint8_2 = new Uint8Array(buffer2); 
var uint8_3 = new Uint8Array(buffer3); 

uint8_1.fill(1); 
uint8_2.fill(2); 

var uint8_1_slice = new Uint8Array(buffer1 , 0 , 3); 
var uint8_2_slice = new Uint8Array(buffer2 , 4, 7); 

이 데모에서는 buffer3을 1,1,1,1,2,2,2,2로 설정해야합니다. 1,1,1,1,2,2,2,2을 할

이 데모를 들어 슬라이스

답변

1

를 사용할 수 없다는 buffer3를 얻을 필요가있다. n 변수보다 다른 uint8_1.byteLength/2uint8_2에 가치를 uint8_3을 설정하는 경우

당신은 for 루프를 사용할 수 uint8_1 값으로 uint8_3을 설정합니다.

var len = 8; 
 

 
var buffer1 = new ArrayBuffer(len); 
 
var buffer2 = new ArrayBuffer(len); 
 
var buffer3 = new ArrayBuffer(len); 
 

 
var uint8_1 = new Uint8Array(buffer1); 
 
var uint8_2 = new Uint8Array(buffer2); 
 
var uint8_3 = new Uint8Array(buffer3); 
 

 
uint8_1.fill(1); 
 
uint8_2.fill(2); 
 
// `len` : uint8_1.byteLength/2 + uint8_2.byteLength/2 
 
for (var n = 0; n < len; n++) { 
 
    uint8_3[n] = n < len/2 ? uint8_1[n] : uint8_2[n]; 
 
} 
 

 
console.log(uint8_3);

+0

올바른 트랙에 있습니다. 한 번에 1 바이트 씩 복사하지 않으므로 세트를 사용해야합니다. – brianxautumn

+0

실제로 죄송합니다. 슬라이스를 사용할 수 없으며 새 배열을 반환합니다. – brianxautumn

+0

@brianxautumn _ "실제로 죄송합니다. 슬라이스를 사용할 수 없습니다. 새 배열을 반환합니다."_ 무슨 뜻인지 모르시겠습니까? 요구 사항은 새로운 배열을 생성하지 않아야합니까? – guest271314

0

나는 어떤 사람들은 array.length를 사용 보았다. 배열이 요소 당 1 바이트 만 있으면 좋습니다. 다른 입력 된 배열이 채워지지만이 예제에서는 a2이 채워지지 않은 경우에도 문제가 없습니다. 이것이 byteLength을 사용하는 것이 더 나은 이유입니다. 이것은 또한 Blob 생성자가 어떻게 파트를 연결시키는 지에 대한 것입니다.

// Concatenate a mix of typed arrays 
function concatenate(...arrays) { 
    // Calculate byteSize from all arrays 
    let size = arrays.reduce((a,b) => a + b.byteLength, 0) 
    // Allcolate a new buffer 
    let result = new Uint8Array(size) 

    // Build the new array 
    let offset = 0 
    for (let arr of arrays) { 
    result.set(arr, offset) 
    offset += arr.byteLength 
    } 

    return result 
} 

// the total length of 1-3 = 5 
// the total byteLength of 1-3 = 6 
let a1 = Uint8Array.of(1, 2) // [1, 2] 
let a2 = Uint16Array.of(3) // [3] just for the fun of it 16 takes up 2 bytes 
let a3 = Uint8Array.of(4, 5) // [4, 5] 

concatenate(a1, a2, a3) // [1, 2, 3, 0, 4, 5] 

/********/ 
var blob = new Blob([a1, a2, a3]) 
var res = new Response(blob) 
res.arrayBuffer().then(buffer => console.log(new Uint8Array(buffer))) 
// [1, 2, 3, 0, 4, 5]