İlk damlalar
This commit is contained in:
		
						commit
						2c4c450fe8
					
				| 
						 | 
				
			
			@ -0,0 +1,11 @@
 | 
			
		|||
<!DOCTYPE html>
 | 
			
		||||
<html lang="en">
 | 
			
		||||
<head>
 | 
			
		||||
    <meta charset="UTF-8">
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 | 
			
		||||
    <title>Document</title>
 | 
			
		||||
</head>
 | 
			
		||||
<body>
 | 
			
		||||
    <script src="./memory.js"></script>
 | 
			
		||||
</body>
 | 
			
		||||
</html>
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,364 @@
 | 
			
		|||
class ProcessableData {
 | 
			
		||||
    constructor(data, from = 0, to){
 | 
			
		||||
        if(data){
 | 
			
		||||
            this.data = data;
 | 
			
		||||
            this.init(from, to);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /** @type {Uint8Array} */
 | 
			
		||||
    data = null;
 | 
			
		||||
    /** @type {DataView} */
 | 
			
		||||
    dt = null;
 | 
			
		||||
    /** @type {number} */
 | 
			
		||||
    cursor = 0;
 | 
			
		||||
    /**
 | 
			
		||||
     * @param {number} from 
 | 
			
		||||
     * @param {number} to 
 | 
			
		||||
     */
 | 
			
		||||
    init(from, to){
 | 
			
		||||
        if(this.data == null)
 | 
			
		||||
        {
 | 
			
		||||
            this.data = new Uint8Array(1024 * 1024);
 | 
			
		||||
        }
 | 
			
		||||
        this.dt = new DataView(this.data.buffer, from, to);
 | 
			
		||||
    }
 | 
			
		||||
    /** @param {number} value  */
 | 
			
		||||
    writeUInt8(value){
 | 
			
		||||
        this.dt.setUint8(this.cursor,value);
 | 
			
		||||
        this.cursor += 1;
 | 
			
		||||
    }
 | 
			
		||||
    /** @param {number} value  */
 | 
			
		||||
    writeUInt16(value){
 | 
			
		||||
        this.dt.setUint16(this.cursor,value);
 | 
			
		||||
        this.cursor += 2;
 | 
			
		||||
    }
 | 
			
		||||
    /** @param {number} value  */
 | 
			
		||||
    writeUInt32(value){
 | 
			
		||||
        this.dt.setUint32(this.cursor,value);
 | 
			
		||||
        this.cursor += 4;
 | 
			
		||||
    }
 | 
			
		||||
    /** @param {number} value  */
 | 
			
		||||
    writeInt8(value){
 | 
			
		||||
        this.dt.setInt8(this.cursor,value);
 | 
			
		||||
        this.cursor += 1;
 | 
			
		||||
    }
 | 
			
		||||
    /** @param {number} value  */
 | 
			
		||||
    writeInt16(value){
 | 
			
		||||
        this.dt.setInt16(this.cursor,value);
 | 
			
		||||
        this.cursor += 2;
 | 
			
		||||
    }
 | 
			
		||||
    /** @param {number} value  */
 | 
			
		||||
    writeInt32(value){
 | 
			
		||||
        this.dt.setInt32(this.cursor,value);
 | 
			
		||||
        this.cursor += 4;
 | 
			
		||||
    }
 | 
			
		||||
    /** @param {number} value  */
 | 
			
		||||
    writeFloat32(value){
 | 
			
		||||
        this.dt.setFloat32(this.cursor,value);
 | 
			
		||||
        this.cursor += 4;
 | 
			
		||||
    }
 | 
			
		||||
    /** @param {number} value  */
 | 
			
		||||
    writeFloat64(value){
 | 
			
		||||
        this.dt.setFloat64(this.cursor,value);
 | 
			
		||||
        this.cursor += 8;
 | 
			
		||||
    }
 | 
			
		||||
    /** @returns {number}  */
 | 
			
		||||
    readUInt8(){
 | 
			
		||||
        let value = this.dt.getUint8(this.cursor);
 | 
			
		||||
        this.cursor += 1;
 | 
			
		||||
        return value;
 | 
			
		||||
    }
 | 
			
		||||
    /** @returns {number} */
 | 
			
		||||
    readUInt16(){
 | 
			
		||||
        let value = this.dt.getUint16(this.cursor);
 | 
			
		||||
        this.cursor += 2;
 | 
			
		||||
        return value;
 | 
			
		||||
    }
 | 
			
		||||
    /** @returns {number} */
 | 
			
		||||
    readUInt32(){
 | 
			
		||||
        let value = this.dt.getUint32(this.cursor);
 | 
			
		||||
        this.cursor += 4;
 | 
			
		||||
        return value;
 | 
			
		||||
    }
 | 
			
		||||
    /** @returns {number} */
 | 
			
		||||
    readInt8(){
 | 
			
		||||
        let value = this.dt.getInt8(this.cursor);
 | 
			
		||||
        this.cursor += 1;
 | 
			
		||||
        return value;
 | 
			
		||||
    }
 | 
			
		||||
    /** @returns {number} */
 | 
			
		||||
    readInt16(){
 | 
			
		||||
        let value = this.dt.getInt16(this.cursor);
 | 
			
		||||
        this.cursor += 2;
 | 
			
		||||
        return value;
 | 
			
		||||
    }
 | 
			
		||||
    /** @returns {number} */
 | 
			
		||||
    readInt32(){
 | 
			
		||||
        let value = this.dt.getInt32(this.cursor);
 | 
			
		||||
        this.cursor += 4;
 | 
			
		||||
        return value;
 | 
			
		||||
    }
 | 
			
		||||
    /** @returns {number} */
 | 
			
		||||
    readFloat32(){
 | 
			
		||||
        let value = this.dt.getFloat32(this.cursor);
 | 
			
		||||
        this.cursor += 4;
 | 
			
		||||
        return value;
 | 
			
		||||
    }
 | 
			
		||||
    /** @returns {number} */
 | 
			
		||||
    readFloat64(){
 | 
			
		||||
        let value = this.dt.getFloat64(this.cursor);
 | 
			
		||||
        this.cursor += 8;
 | 
			
		||||
        return value;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    getAllData(){
 | 
			
		||||
        return this.dt.buffer.slice(0, this.cursor);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class ConstructedData extends ProcessableData {
 | 
			
		||||
    /** @param {string} value  */
 | 
			
		||||
    writeString(value){
 | 
			
		||||
        let encodedText = new TextEncoder().encode(value);
 | 
			
		||||
        for (const byte of encodedText)
 | 
			
		||||
        {
 | 
			
		||||
            this.writeUInt8(byte);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * @param {number} value 
 | 
			
		||||
     * @returns {string}
 | 
			
		||||
     */
 | 
			
		||||
    readString(size){
 | 
			
		||||
        let minibuffer = this.data.buffer.slice(this.cursor, this.cursor + size);
 | 
			
		||||
        return new TextDecoder().decode(minibuffer);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * @param {boolean|0|1} flag1 
 | 
			
		||||
     * @param {boolean|0|1} flag2 
 | 
			
		||||
     * @param {boolean|0|1} flag3 
 | 
			
		||||
     * @param {boolean|0|1} flag4 
 | 
			
		||||
     * @param {boolean|0|1} flag5 
 | 
			
		||||
     * @param {boolean|0|1} flag6 
 | 
			
		||||
     * @param {boolean|0|1} flag7 
 | 
			
		||||
     * @param {boolean|0|1} flag8 
 | 
			
		||||
     */
 | 
			
		||||
    writeFlags(flag1, flag2, flag3, flag4, flag5, flag6, flag7, flag8){
 | 
			
		||||
        let value = (
 | 
			
		||||
            (flag1 << 1) |
 | 
			
		||||
            (flag2 << 2) |
 | 
			
		||||
            (flag3 << 3) |
 | 
			
		||||
            (flag4 << 4) |
 | 
			
		||||
            (flag5 << 5) |
 | 
			
		||||
            (flag6 << 6) |
 | 
			
		||||
            (flag7 << 7) |
 | 
			
		||||
            (flag8 << 8)
 | 
			
		||||
        );
 | 
			
		||||
        this.writeUInt8(value);
 | 
			
		||||
    }
 | 
			
		||||
    /** @returns {number[]} */
 | 
			
		||||
    readFlags(){
 | 
			
		||||
        let value = this.readUInt8();
 | 
			
		||||
        let result = (
 | 
			
		||||
            (value >> 0 & 0x1),
 | 
			
		||||
            (value >> 1 & 0x1),
 | 
			
		||||
            (value >> 2 & 0x1),
 | 
			
		||||
            (value >> 3 & 0x1),
 | 
			
		||||
            (value >> 4 & 0x1),
 | 
			
		||||
            (value >> 5 & 0x1),
 | 
			
		||||
            (value >> 6 & 0x1),
 | 
			
		||||
            (value >> 7 & 0x1)
 | 
			
		||||
        );
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * @param {number} r 
 | 
			
		||||
     * @param {number} g 
 | 
			
		||||
     * @param {number} b 
 | 
			
		||||
     */
 | 
			
		||||
    writeRGB(r,g,b){
 | 
			
		||||
        this.writeUInt8(r);
 | 
			
		||||
        this.writeUInt8(g);
 | 
			
		||||
        this.writeUInt8(b);
 | 
			
		||||
    }
 | 
			
		||||
    /** @returns {{r:number,g:number,b:number}} */
 | 
			
		||||
    readRGB(){
 | 
			
		||||
        return {
 | 
			
		||||
            r: this.readUInt8(),
 | 
			
		||||
            g: this.readUInt8(),
 | 
			
		||||
            b: this.readUInt8()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * @param {number} r 
 | 
			
		||||
     * @param {number} g 
 | 
			
		||||
     * @param {number} b 
 | 
			
		||||
     */
 | 
			
		||||
    writeRGBA(r,g,b,a){
 | 
			
		||||
        this.writeUInt8(r);
 | 
			
		||||
        this.writeUInt8(g);
 | 
			
		||||
        this.writeUInt8(b);
 | 
			
		||||
        this.writeUInt8(a);
 | 
			
		||||
    }
 | 
			
		||||
    /** @returns {{r:number,g:number,b:number,a:number}} */
 | 
			
		||||
    readRGBA(){
 | 
			
		||||
        return {
 | 
			
		||||
            r: this.readUInt8(),
 | 
			
		||||
            g: this.readUInt8(),
 | 
			
		||||
            b: this.readUInt8(),
 | 
			
		||||
            a: this.readUInt8()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /** @param {number} size  */
 | 
			
		||||
    writeVarNumber(size){
 | 
			
		||||
        let iszero = false;
 | 
			
		||||
        let isInt = Number.isInteger(size);
 | 
			
		||||
        let is1Byte = false;
 | 
			
		||||
        let is2Byte = false;
 | 
			
		||||
        let is4Byte = false;
 | 
			
		||||
        let is8Byte = false;
 | 
			
		||||
        let issigned = false;
 | 
			
		||||
 | 
			
		||||
        issigned = size < 0;
 | 
			
		||||
 | 
			
		||||
        if(isInt){
 | 
			
		||||
            if(size === 0)
 | 
			
		||||
            {
 | 
			
		||||
                iszero = true;
 | 
			
		||||
            }else if(size >= 0 && size <= 255)
 | 
			
		||||
            {
 | 
			
		||||
                is1Byte = true;
 | 
			
		||||
            }else if(size >= -127 && size <= 127)
 | 
			
		||||
            {
 | 
			
		||||
                is1Byte = true;
 | 
			
		||||
            }else if(size >= -32768 && size <= 32767)
 | 
			
		||||
            {
 | 
			
		||||
                is2Byte = true;
 | 
			
		||||
            }else if(size >= -2147483648 && size <= 2147483647)
 | 
			
		||||
            {
 | 
			
		||||
                is4Byte = true;
 | 
			
		||||
            }
 | 
			
		||||
        }else {
 | 
			
		||||
            if(size >= -3.4028235e38 && size <= 3.4028235e38)
 | 
			
		||||
            {
 | 
			
		||||
                is4Byte = true;
 | 
			
		||||
            }else {
 | 
			
		||||
                is8Byte = true;
 | 
			
		||||
            }
 | 
			
		||||
        };
 | 
			
		||||
        
 | 
			
		||||
        this.writeFlags(
 | 
			
		||||
            iszero,
 | 
			
		||||
            isInt,
 | 
			
		||||
            is1Byte,
 | 
			
		||||
            is2Byte,
 | 
			
		||||
            is4Byte,
 | 
			
		||||
            is8Byte,
 | 
			
		||||
            issigned,
 | 
			
		||||
            255
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        if(isInt == false)
 | 
			
		||||
        {
 | 
			
		||||
            if(is4Byte)
 | 
			
		||||
            {
 | 
			
		||||
                this.writeFloat32(size);
 | 
			
		||||
            }
 | 
			
		||||
            if(is8Byte)
 | 
			
		||||
            {
 | 
			
		||||
                this.writeFloat64(size);
 | 
			
		||||
            }
 | 
			
		||||
        }else{
 | 
			
		||||
            if(is1Byte)
 | 
			
		||||
            {
 | 
			
		||||
                if(issigned)
 | 
			
		||||
                {
 | 
			
		||||
                    this.writeInt16(size);
 | 
			
		||||
                }else{
 | 
			
		||||
                    this.writeUInt8(size);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            if(is2Byte)
 | 
			
		||||
            {
 | 
			
		||||
                if(issigned)
 | 
			
		||||
                {
 | 
			
		||||
                    this.writeInt32(size);
 | 
			
		||||
                }else{
 | 
			
		||||
                    this.writeUInt16(size);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            if(is4Byte)
 | 
			
		||||
            {
 | 
			
		||||
                if(issigned)
 | 
			
		||||
                {
 | 
			
		||||
                    this.writeInt32(size);
 | 
			
		||||
                }else{
 | 
			
		||||
                    this.writeUInt32(size);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /** @returns {number} */
 | 
			
		||||
    readVarNumber(){
 | 
			
		||||
        let [
 | 
			
		||||
            iszero,
 | 
			
		||||
            isInt,
 | 
			
		||||
            is1Byte,
 | 
			
		||||
            is2Byte,
 | 
			
		||||
            is4Byte,
 | 
			
		||||
            is8Byte,
 | 
			
		||||
            issigned
 | 
			
		||||
        ] = this.readFlags();
 | 
			
		||||
    
 | 
			
		||||
        if(iszero)
 | 
			
		||||
        {
 | 
			
		||||
            return 0;
 | 
			
		||||
        }
 | 
			
		||||
        if(!isInt)
 | 
			
		||||
        {
 | 
			
		||||
            if(is4Byte)
 | 
			
		||||
            {
 | 
			
		||||
                return this.readFloat32(); // 32-bit float
 | 
			
		||||
            }else if(is8Byte)
 | 
			
		||||
            {
 | 
			
		||||
                return this.readFloat64(); // 64-bit float
 | 
			
		||||
            }
 | 
			
		||||
        }else {
 | 
			
		||||
            if(is1Byte)
 | 
			
		||||
            {
 | 
			
		||||
                if(issigned)
 | 
			
		||||
                {
 | 
			
		||||
                    return this.readInt8();
 | 
			
		||||
                }else
 | 
			
		||||
                {
 | 
			
		||||
                    return this.readUInt8();
 | 
			
		||||
                }
 | 
			
		||||
            }else if(is2Byte)
 | 
			
		||||
            {
 | 
			
		||||
                if(issigned)
 | 
			
		||||
                {
 | 
			
		||||
                    return this.readInt16();
 | 
			
		||||
                }else {
 | 
			
		||||
                    return this.readUInt16();
 | 
			
		||||
                }
 | 
			
		||||
            }else if(is4Byte)
 | 
			
		||||
            {
 | 
			
		||||
                if(issigned)
 | 
			
		||||
                {
 | 
			
		||||
                    return this.readInt32();
 | 
			
		||||
                }else {
 | 
			
		||||
                    return this.readUInt32();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /** @param {Date|string} dateorString  */
 | 
			
		||||
    writeDate(dateorString){
 | 
			
		||||
        let date = new Date(dateorString);
 | 
			
		||||
        this.writeUInt32(+date);
 | 
			
		||||
    }
 | 
			
		||||
    /** @returns {Date}  */
 | 
			
		||||
    readDate(){
 | 
			
		||||
        return new Date(this.readUInt32());
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
		Loading…
	
		Reference in New Issue