lib-utils-ts
Version:
<img src="https://img.shields.io/npm/v/lib-utils-ts"/> <img src="https://img.shields.io/snyk/vulnerabilities/npm/lib-utils-ts"/> <img src="https://img.shields.io/npm/l/lib-utils-ts"/> <img src="https://img.shields.io/github/languages/top/devGnode/lib-util
91 lines (77 loc) • 3.63 kB
text/typescript
import {BinaryBuffer} from "./BinaryBuffer";
import {BitsType, primitiveNumber, primitiveString, pvoidStruct, s_bits} from "./Globals";
import {BinArray} from "./BinArray";
import {PrimitiveNumber} from "./PrimitiveNumber";
import {PrimitiveString} from "./PrimitiveString";
import {Encoder} from "../file/charset/Encoder";
import {CString} from "./CString";
import {Objects} from "../type/Objects";
import {RuntimeException} from "../Exception";
import {Convert} from "./Convert";
/***
* @writer maroder
* @version 1.0-R-JSTrip
*/
export class BinaryOutputStream {
private buffer:BinaryBuffer = new BinaryBuffer();
public constructor() {this.buffer.safe(false);}
/***
* @bit2chr:
* Manage 64bits but, Voila ( by slice of 32 bits ) ....
*
* @param pSubStruct { fb:7, sb:1, tb:3, eb:3 }
* @param pVoiSubStruct { fb:3, sb:1, tb:2, ef:2 }
* @return "ÿ"
*/
public bit2chr( pSubStruct: s_bits, pVoiSubStruct: s_bits ):string{
let key:string, len:number, tLen:number = 0, n:number = 0, out:string = "";
Objects.requireNotNull(pSubStruct,"missing pSubStruct args");
Objects.requireNotNull(pVoiSubStruct, "missing pVoidSubStruct args");
for( key in pVoiSubStruct ){
Objects.requireNotNull(pSubStruct[key], `Structure element not found : ${key}`);
len = pVoiSubStruct[key];
if( pSubStruct[key] >= 0 && pSubStruct[key] < Math.pow( 2, len ) ){
// overflow int 32 bit QWORD not supported
// by slice of 32bits
if( Math.pow( 2, ( tLen += len ) ) > Math.pow( 2, 0x20 /*SZB.DW*/ ) ){
out += Convert.To.int2Str(n);
tLen = n = 0;
}
n = ( n > 0 ) ? (( n << len ) | pSubStruct[key] ) : pSubStruct[key];
}else{
throw new RuntimeException(`Bits Structure Overflow : ${key} use ${len} bit(s)`);
}
}
return out + Convert.To.int2Str(n);
}
public toBuffer( pStruct: pvoidStruct, pVoidStruct: pvoidStruct = null ):BinaryBuffer{
let pType: primitiveNumber|primitiveString|BinArray<BitsType>|Function|s_bits,
key:string;
if(this.buffer.sizeOf()!=0) return this.buffer;
for( key in pStruct ){
pType = pStruct[key];
// Primitive type
if( pType instanceof PrimitiveNumber.PrimitiveNumberBuilder ) this.buffer.append((<primitiveNumber>pType).toString());
// CONSTANT STRING
else if( pType instanceof PrimitiveString.PrimitiveStrBuilder ){
let end:string = Encoder.getNullByte();
// check Ptr DWORD check Len ADD ÿ ending
if( pType instanceof CString && pType.hasPointer() ){
let b:number = 0;
if( pType.valueOf().length%pType.getPointer().getRange() > 0 ){
b = pType.getPointer().getRange() - (pType.valueOf().length%pType.getPointer().getRange());
}
end += String.repeatString("ÿ",b).toString();
}
this.buffer.append( pType.valueOf() + end );
}
else if(pType instanceof BinArray){ pType.map(value=>this.buffer.append( value.toString()) ); }
// Sub bits structure
// {}
else if(typeof pType ==="object"&&!(pType instanceof Function)){
this.buffer.append( this.bit2chr(<s_bits>pType,<s_bits>pVoidStruct[key] ) );
}
}
return this.buffer;
}
}