📄 ztvdeflate.pas
字号:
// compress
(**********************************************************************
Copyright 1998-2003, Microchip Data Systems / Carl Bunton
Under license agreement, this source module may be used only on a
single computer.
No portion of this module may be reproduced, copied, revised, edited,
distributed or transmitted via electronic means except in compiled
application format.
Web-site: http://www.ziptv.com
Email: custsupt@ziptv.com
**********************************************************************)
Unit ztvDeflate;
Interface
// DO NOT CHANGE THESE SWITCHES! Revising these switches will
// produce unexpected errors, resulting in the failure of the
// deflate method.
{$J+} { Writeable Typed Constants } // v4.0 added
{$Q-} { Overflow Checking } // v4.5.3 added
Uses
Classes,
ztvBase,
ztvGbls,
ztvStreams,
ztvConsts;
{$I ZipTV.inc}
Const
LITERALS = 256;
LENGTH_CODES = 29;
{$IFDEF DEFLATE64}
D_CODES_DEF64 = 30; //32; //changed from 30 for deflate64
D_CODES = 30;
{$ELSE}
D_CODES = 30;
{$ENDIF}
BL_CODES = 19;
L_CODES = LITERALS + 1 + LENGTH_CODES;
HEAP_SIZE = (2 * L_CODES + 1);
MAX_BITS = 15;
Type
ct_data_ptr = ^ct_data;
ct_data = Record
fc:
Record
Case Byte Of
0: (freq: ush);
1: (code: ush);
End;
dl:
Record
Case Byte Of
0: (dad: ush);
1: (Len: ush);
End;
End;
zIntfArray = Array[0..(MaxMemBlock Div SizeOf(Intf)) - 1] Of Intf;
ltree_type = Array[0..HEAP_SIZE - 1] Of ct_data;
{$IFDEF DEFLATE64}
dtree_type = Array[0..2 * D_CODES_DEF64 + 1 - 1] Of ct_data;
{$ELSE}
dtree_type = Array[0..2 * D_CODES + 1 - 1] Of ct_data;
{$ENDIF}
htree_type = Array[0..2 * BL_CODES + 1 - 1] Of ct_data;
tree_type = Array[0..(MaxMemBlock Div SizeOf(ct_data)) - 1] Of ct_data;
zushfArray = Array[0..(MaxMemBlock Div SizeOf(ushf)) - 1] Of ushf;
zPosfArray = Array[0..(MaxMemBlock Div SizeOf(Posf)) - 1] Of Posf;
zByteArray = Array[0..(MaxMemBlock Div SizeOf(_Bytef)) - 1] Of _Bytef;
pzPosfArray = ^zPosfArray;
pushfArray = ^zushfArray;
pzIntfArray = ^zIntfArray;
tree_ptr = ^tree_type;
pzByteArray = ^zByteArray;
Type
static_tree_desc_ptr = ^static_tree_desc;
static_tree_desc =
Record
{const} static_tree: tree_ptr; { static tree or NIL }
{const} extra_bits: pzIntfArray; { extra bits for each code or NIL }
extra_base: _int; { base index for extra_bits }
elems: _int; { max number of elements in the tree }
max_length: _int; { max bit length for the codes }
End;
tree_desc_ptr = ^tree_desc;
tree_desc = Record
dyn_tree: tree_ptr; { the dynamic tree }
max_code: _int; { largest code with non zero frequency }
stat_desc: static_tree_desc_ptr; { the corresponding static tree }
End;
zuchfArray = zByteArray;
puchfArray = ^zuchfArray;
deflate_state_ptr = ^deflate_state;
deflate_state = Record
strm: ztv_streamp; { pointer back to this stream }
Status: _int; { as the name implies }
pending_buf: pzByteArray; { output still pending }
pending_buf_size: longint; { size of pending_buf }
pending_out: _pBytef; { next pending byte to output to the stream }
pending: _int; { nb of bytes in the pending buffer }
noheader: _int; { suppress zlib header and adler32 }
data_type: Byte; { UNKNOWN, BINARY or ASCII }
method: Byte; { STORED (for zip only) or DEFLATED }
last_flush: _int; { value of flush param for previous deflate call }
w_size: _uInt; { LZ77 window size (32K by default) }
w_bits: _uInt; { log2(w_size) (8..16) }
w_mask: _uInt; { w_size - 1 }
window: pzByteArray;
window_size: longint;
prev: pzPosfArray;
head: pzPosfArray; { Heads of the hash chains or NIL. }
ins_h: _uInt; { hash index of string to be inserted }
hash_size: _uInt; { number of elements in hash table }
hash_bits: _uInt; { log2(hash_size) }
hash_mask: _uInt; { hash_size-1 }
hash_shift: _uInt;
block_start: longint;
match_length: _uInt; { length of best match }
prev_match: IPos; { previous match }
match_available: Boolean; { set if previous match exists }
strstart: _uInt; { start of string to insert }
match_start: _uInt; { start of matching string }
lookahead: _uInt; { number of valid bytes ahead in window }
prev_length: _uInt;
max_chain_length: _uInt;
level: _int; { compression level (1..9) }
strategy: _int; { favor or force Huffman coding}
good_match: _uInt;
nice_match: _int; { Stop searching when current match exceeds this }
dyn_ltree: ltree_type; { literal and length tree }
dyn_dtree: dtree_type; { distance tree }
bl_tree: htree_type; { Huffman tree for bit lengths }
l_desc: tree_desc; { desc. for literal tree }
d_desc: tree_desc; { desc. for distance tree }
bl_desc: tree_desc; { desc. for bit length tree }
bl_count: Array[0..MAX_BITS + 1 - 1] Of ush;
heap: Array[0..2 * L_CODES + 1 - 1] Of _int; { heap used to build the Huffman trees }
heap_len: _int; { number of elements in the heap }
heap_max: _int; { element of largest frequency }
depth: Array[0..2 * L_CODES + 1 - 1] Of uch;
l_buf: puchfArray; { buffer for literals or lengths }
lit_bufsize: _uInt;
last_lit: _uInt; { running index in l_buf }
d_buf: pushfArray;
opt_len: longint; { bit length of current block with optimal trees }
static_len: longint; { bit length of current block with static trees }
compressed_len: longint; { total bit length of compressed file }
matches: _uInt; { number of string matches in current block }
last_eob_len: _int; { bit length of EOB code for last block }
bi_buf: ush;
bi_valid: _int;
Case Byte Of
0: (max_lazy_match: _uInt);
1: (max_insert_length: _uInt);
End;
Function _deflate(Var strm: ztv_stream; Flush: _int): _int;
Function _deflateEnd(Var strm: ztv_stream): _int;
Function deflateInit2(Var strm: ztv_stream; level: _int; method: _int;
windowBits: _int; memLevel: _int; strategy: _int): _int;
Function deflateSetDictionary(Var strm: ztv_stream; dictionary: _pBytef;
dictLength: word): _int;
Function deflateCopy(dest: ztv_streamp; source: ztv_streamp): _int;
Function ztvCompressStreamProc(InStream, OutStream: TStream32; zsp:
ztv_stream_plus; Var CRC: u_long; DefType: TDeflateType; ProgressProc:
TNotifyEvent; maxbits: ShortInt): Boolean;
//Function ztvCompressStream( InStream, OutStream: TStream32 ): _int;
Function ztvCompress_String_Method1(Var CompressedStr: String; Var StrLength: _int;
level: TDeflateType): u_long;
Function ztvCompress_String_Method2(Var CompressedStr: String; Var StrLength: _int;
Level: TDeflateType): u_long;
Function ztvCompress_BufToBuf(Const inbuf: Pointer; InBytes: _int;
Var outbuf: Pointer; Var outBytes: _int; level: TDeflateType): u_long;
Function ztvCompress_FileToStream(FileName: String; OutStream: TStream32;
inSize: Int64): u_long;
Function ztvCompress_StreamToClipboard(Stream: TStream32; inSize: Int64;
Var CompressedSize: Int64; level: TDeflateType): u_long;
Function ztvCompress_StreamToStream(InStream, OutStream: TStream32;
inSize: Int64; level: TDeflateType): u_long;
Implementation
Uses
SysUtils,
Dialogs,
ztvHeaders,
Err_Msgs,
ztvRegister;
Type
block_state = (need_more, block_done, finish_started, finish_done);
compress_func = Function(Var s: deflate_state; Flush: _int): block_state;
Function deflate_stored(Var s: deflate_state; Flush: _int): block_state; Far; Forward;
Function deflate_fast(Var s: deflate_state; Flush: _int): block_state; Far; Forward;
Function deflate_slow(Var s: deflate_state; Flush: _int): block_state; Far; Forward;
Procedure lm_init(Var s: deflate_state); Forward;
Const
ZNIL = 0;
TOO_FAR = 4096;
SMALLEST = 1;
DIST_CODE_LEN = 512;
REP_3_6 = 16;
REPZ_3_10 = 17;
REPZ_11_138 = 18;
BUF_SIZE = (8 * 2 * SizeOf(char));
PRESET_DICT = $20;
MAX_BL_BITS = 7;
END_BLOCK = 256;
STORED_BLOCK = 0;
STATIC_TREES = 1;
DYN_TREES = 2;
MAX_MATCH = 258;
MIN_MATCH = 3;
{$IFDEF DEFLATE64}
MAX_MATCH_DEF64 = 64 * 1024; {lengths are 3..65536 for deflate64}
MIN_LOOKAHEAD_DEF64 = (MAX_MATCH_DEF64 + MIN_MATCH + 1); //deflate64
{$ELSE}
MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);
{$ENDIF}
Type
Config = Record
good_length: ush;
max_lazy: ush;
nice_length: ush;
max_chain: ush;
func: compress_func;
End;
Const
configuration_table: Array[0..10 - 1] Of Config = (
{ good lazy nice chain }
(good_length: 0; max_lazy: 0; nice_length: 0; max_chain: 0; func: deflate_stored), { store only }
(good_length: 4; max_lazy: 4; nice_length: 8; max_chain: 4; func: deflate_fast), { maximum speed, no lazy matches }
(good_length: 4; max_lazy: 5; nice_length: 16; max_chain: 8; func: deflate_fast),
(good_length: 4; max_lazy: 6; nice_length: 32; max_chain: 32; func: deflate_fast),
(good_length: 4; max_lazy: 4; nice_length: 16; max_chain: 16; func: deflate_slow), { lazy matches }
(good_length: 8; max_lazy: 16; nice_length: 32; max_chain: 32; func: deflate_slow),
(good_length: 8; max_lazy: 16; nice_length: 128; max_chain: 128; func: deflate_slow),
(good_length: 8; max_lazy: 32; nice_length: 128; max_chain: 256; func: deflate_slow),
(good_length: 32; max_lazy: 128; nice_length: 258; max_chain: 1024; func: deflate_slow),
(good_length: 32; max_lazy: 258; nice_length: 258; max_chain: 4096; func: deflate_slow)); { maximum compression }
//(good_length: 64; max_lazy: 512; nice_length: 512; max_chain: 9182)
Const
static_ltree: Array[0..L_CODES + 2 - 1] Of ct_data = (
(fc: (freq: 12); dl: (Len: 8)), (fc: (freq: 140); dl: (Len: 8)), (fc: (freq: 76); dl: (Len: 8)),
(fc: (freq: 204); dl: (Len: 8)), (fc: (freq: 44); dl: (Len: 8)), (fc: (freq: 172); dl: (Len: 8)),
(fc: (freq: 108); dl: (Len: 8)), (fc: (freq: 236); dl: (Len: 8)), (fc: (freq: 28); dl: (Len: 8)),
(fc: (freq: 156); dl: (Len: 8)), (fc: (freq: 92); dl: (Len: 8)), (fc: (freq: 220); dl: (Len: 8)),
(fc: (freq: 60); dl: (Len: 8)), (fc: (freq: 188); dl: (Len: 8)), (fc: (freq: 124); dl: (Len: 8)),
(fc: (freq: 252); dl: (Len: 8)), (fc: (freq: 2); dl: (Len: 8)), (fc: (freq: 130); dl: (Len: 8)),
(fc: (freq: 66); dl: (Len: 8)), (fc: (freq: 194); dl: (Len: 8)), (fc: (freq: 34); dl: (Len: 8)),
(fc: (freq: 162); dl: (Len: 8)), (fc: (freq: 98); dl: (Len: 8)), (fc: (freq: 226); dl: (Len: 8)),
(fc: (freq: 18); dl: (Len: 8)), (fc: (freq: 146); dl: (Len: 8)), (fc: (freq: 82); dl: (Len: 8)),
{10} (fc: (freq: 210); dl: (Len: 8)), (fc: (freq: 50); dl: (Len: 8)), (fc: (freq: 178); dl: (Len: 8)),
(fc: (freq: 114); dl: (Len: 8)), (fc: (freq: 242); dl: (Len: 8)), (fc: (freq: 10); dl: (Len: 8)),
(fc: (freq: 138); dl: (Len: 8)), (fc: (freq: 74); dl: (Len: 8)), (fc: (freq: 202); dl: (Len: 8)),
(fc: (freq: 42); dl: (Len: 8)), (fc: (freq: 170); dl: (Len: 8)), (fc: (freq: 106); dl: (Len: 8)),
(fc: (freq: 234); dl: (Len: 8)), (fc: (freq: 26); dl: (Len: 8)), (fc: (freq: 154); dl: (Len: 8)),
(fc: (freq: 90); dl: (Len: 8)), (fc: (freq: 218); dl: (Len: 8)), (fc: (freq: 58); dl: (Len: 8)),
(fc: (freq: 186); dl: (Len: 8)), (fc: (freq: 122); dl: (Len: 8)), (fc: (freq: 250); dl: (Len: 8)),
(fc: (freq: 6); dl: (Len: 8)), (fc: (freq: 134); dl: (Len: 8)), (fc: (freq: 70); dl: (Len: 8)),
(fc: (freq: 198); dl: (Len: 8)), (fc: (freq: 38); dl: (Len: 8)), (fc: (freq: 166); dl: (Len: 8)),
(fc: (freq: 102); dl: (Len: 8)), (fc: (freq: 230); dl: (Len: 8)), (fc: (freq: 22); dl: (Len: 8)),
{20} (fc: (freq: 150); dl: (Len: 8)), (fc: (freq: 86); dl: (Len: 8)), (fc: (freq: 214); dl: (Len: 8)),
(fc: (freq: 54); dl: (Len: 8)), (fc: (freq: 182); dl: (Len: 8)), (fc: (freq: 118); dl: (Len: 8)),
(fc: (freq: 246); dl: (Len: 8)), (fc: (freq: 14); dl: (Len: 8)), (fc: (freq: 142); dl: (Len: 8)),
(fc: (freq: 78); dl: (Len: 8)), (fc: (freq: 206); dl: (Len: 8)), (fc: (freq: 46); dl: (Len: 8)),
(fc: (freq: 174); dl: (Len: 8)), (fc: (freq: 110); dl: (Len: 8)), (fc: (freq: 238); dl: (Len: 8)),
(fc: (freq: 30); dl: (Len: 8)), (fc: (freq: 158); dl: (Len: 8)), (fc: (freq: 94); dl: (Len: 8)),
(fc: (freq: 222); dl: (Len: 8)), (fc: (freq: 62); dl: (Len: 8)), (fc: (freq: 190); dl: (Len: 8)),
(fc: (freq: 126); dl: (Len: 8)), (fc: (freq: 254); dl: (Len: 8)), (fc: (freq: 1); dl: (Len: 8)),
(fc: (freq: 129); dl: (Len: 8)), (fc: (freq: 65); dl: (Len: 8)), (fc: (freq: 193); dl: (Len: 8)),
(fc: (freq: 33); dl: (Len: 8)), (fc: (freq: 161); dl: (Len: 8)), (fc: (freq: 97); dl: (Len: 8)),
{30} (fc: (freq: 225); dl: (Len: 8)), (fc: (freq: 17); dl: (Len: 8)), (fc: (freq: 145); dl: (Len: 8)),
(fc: (freq: 81); dl: (Len: 8)), (fc: (freq: 209); dl: (Len: 8)), (fc: (freq: 49); dl: (Len: 8)),
(fc: (freq: 177); dl: (Len: 8)), (fc: (freq: 113); dl: (Len: 8)), (fc: (freq: 241); dl: (Len: 8)),
(fc: (freq: 9); dl: (Len: 8)), (fc: (freq: 137); dl: (Len: 8)), (fc: (freq: 73); dl: (Len: 8)),
(fc: (freq: 201); dl: (Len: 8)), (fc: (freq: 41); dl: (Len: 8)), (fc: (freq: 169); dl: (Len: 8)),
(fc: (freq: 105); dl: (Len: 8)), (fc: (freq: 233); dl: (Len: 8)), (fc: (freq: 25); dl: (Len: 8)),
(fc: (freq: 153); dl: (Len: 8)), (fc: (freq: 89); dl: (Len: 8)), (fc: (freq: 217); dl: (Len: 8)),
(fc: (freq: 57); dl: (Len: 8)), (fc: (freq: 185); dl: (Len: 8)), (fc: (freq: 121); dl: (Len: 8)),
(fc: (freq: 249); dl: (Len: 8)), (fc: (freq: 5); dl: (Len: 8)), (fc: (freq: 133); dl: (Len: 8)),
(fc: (freq: 69); dl: (Len: 8)), (fc: (freq: 197); dl: (Len: 8)), (fc: (freq: 37); dl: (Len: 8)),
{40} (fc: (freq: 165); dl: (Len: 8)), (fc: (freq: 101); dl: (Len: 8)), (fc: (freq: 229); dl: (Len: 8)),
(fc: (freq: 21); dl: (Len: 8)), (fc: (freq: 149); dl: (Len: 8)), (fc: (freq: 85); dl: (Len: 8)),
(fc: (freq: 213); dl: (Len: 8)), (fc: (freq: 53); dl: (Len: 8)), (fc: (freq: 181); dl: (Len: 8)),
(fc: (freq: 117); dl: (Len: 8)), (fc: (freq: 245); dl: (Len: 8)), (fc: (freq: 13); dl: (Len: 8)),
(fc: (freq: 141); dl: (Len: 8)), (fc: (freq: 77); dl: (Len: 8)), (fc: (freq: 205); dl: (Len: 8)),
(fc: (freq: 45); dl: (Len: 8)), (fc: (freq: 173); dl: (Len: 8)), (fc: (freq: 109); dl: (Len: 8)),
(fc: (freq: 237); dl: (Len: 8)), (fc: (freq: 29); dl: (Len: 8)), (fc: (freq: 157); dl: (Len: 8)),
(fc: (freq: 93); dl: (Len: 8)), (fc: (freq: 221); dl: (Len: 8)), (fc: (freq: 61); dl: (Len: 8)),
(fc: (freq: 189); dl: (Len: 8)), (fc: (freq: 125); dl: (Len: 8)), (fc: (freq: 253); dl: (Len: 8)),
(fc: (freq: 19); dl: (Len: 9)), (fc: (freq: 275); dl: (Len: 9)), (fc: (freq: 147); dl: (Len: 9)),
{50} (fc: (freq: 403); dl: (Len: 9)), (fc: (freq: 83); dl: (Len: 9)), (fc: (freq: 339); dl: (Len: 9)),
(fc: (freq: 211); dl: (Len: 9)), (fc: (freq: 467); dl: (Len: 9)), (fc: (freq: 51); dl: (Len: 9)),
(fc: (freq: 307); dl: (Len: 9)), (fc: (freq: 179); dl: (Len: 9)), (fc: (freq: 435); dl: (Len: 9)),
(fc: (freq: 115); dl: (Len: 9)), (fc: (freq: 371); dl: (Len: 9)), (fc: (freq: 243); dl: (Len: 9)),
(fc: (freq: 499); dl: (Len: 9)), (fc: (freq: 11); dl: (Len: 9)), (fc: (freq: 267); dl: (Len: 9)),
(fc: (freq: 139); dl: (Len: 9)), (fc: (freq: 395); dl: (Len: 9)), (fc: (freq: 75); dl: (Len: 9)),
(fc: (freq: 331); dl: (Len: 9)), (fc: (freq: 203); dl: (Len: 9)), (fc: (freq: 459); dl: (Len: 9)),
(fc: (freq: 43); dl: (Len: 9)), (fc: (freq: 299); dl: (Len: 9)), (fc: (freq: 171); dl: (Len: 9)),
(fc: (freq: 427); dl: (Len: 9)), (fc: (freq: 107); dl: (Len: 9)), (fc: (freq: 363); dl: (Len: 9)),
(fc: (freq: 235); dl: (Len: 9)), (fc: (freq: 491); dl: (Len: 9)), (fc: (freq: 27); dl: (Len: 9)),
{60} (fc: (freq: 283); dl: (Len: 9)), (fc: (freq: 155); dl: (Len: 9)), (fc: (freq: 411); dl: (Len: 9)),
(fc: (freq: 91); dl: (Len: 9)), (fc: (freq: 347); dl: (Len: 9)), (fc: (freq: 219); dl: (Len: 9)),
(fc: (freq: 475); dl: (Len: 9)), (fc: (freq: 59); dl: (Len: 9)), (fc: (freq: 315); dl: (Len: 9)),
(fc: (freq: 187); dl: (Len: 9)), (fc: (freq: 443); dl: (Len: 9)), (fc: (freq: 123); dl: (Len: 9)),
(fc: (freq: 379); dl: (Len: 9)), (fc: (freq: 251); dl: (Len: 9)), (fc: (freq: 507); dl: (Len: 9)),
(fc: (freq: 7); dl: (Len: 9)), (fc: (freq: 263); dl: (Len: 9)), (fc: (freq: 135); dl: (Len: 9)),
(fc: (freq: 391); dl: (Len: 9)), (fc: (freq: 71); dl: (Len: 9)), (fc: (freq: 327); dl: (Len: 9)),
(fc: (freq: 199); dl: (Len: 9)), (fc: (freq: 455); dl: (Len: 9)), (fc: (freq: 39); dl: (Len: 9)),
(fc: (freq: 295); dl: (Len: 9)), (fc: (freq: 167); dl: (Len: 9)), (fc: (freq: 423); dl: (Len: 9)),
(fc: (freq: 103); dl: (Len: 9)), (fc: (freq: 359); dl: (Len: 9)), (fc: (freq: 231); dl: (Len: 9)),
{70} (fc: (freq: 487); dl: (Len: 9)), (fc: (freq: 23); dl: (Len: 9)), (fc: (freq: 279); dl: (Len: 9)),
(fc: (freq: 151); dl: (Len: 9)), (fc: (freq: 407); dl: (Len: 9)), (fc: (freq: 87); dl: (Len: 9)),
(fc: (freq: 343); dl: (Len: 9)), (fc: (freq: 215); dl: (Len: 9)), (fc: (freq: 471); dl: (Len: 9)),
(fc: (freq: 55); dl: (Len: 9)), (fc: (freq: 311); dl: (Len: 9)), (fc: (freq: 183); dl: (Len: 9)),
(fc: (freq: 439); dl: (Len: 9)), (fc: (freq: 119); dl: (Len: 9)), (fc: (freq: 375); dl: (Len: 9)),
(fc: (freq: 247); dl: (Len: 9)), (fc: (freq: 503); dl: (Len: 9)), (fc: (freq: 15); dl: (Len: 9)),
(fc: (freq: 271); dl: (Len: 9)), (fc: (freq: 143); dl: (Len: 9)), (fc: (freq: 399); dl: (Len: 9)),
(fc: (freq: 79); dl: (Len: 9)), (fc: (freq: 335); dl: (Len: 9)), (fc: (freq: 207); dl: (Len: 9)),
(fc: (freq: 463); dl: (Len: 9)), (fc: (freq: 47); dl: (Len: 9)), (fc: (freq: 303); dl: (Len: 9)),
(fc: (freq: 175); dl: (Len: 9)), (fc: (freq: 431); dl: (Len: 9)), (fc: (freq: 111); dl: (Len: 9)),
{80} (fc: (freq: 367); dl: (Len: 9)), (fc: (freq: 239); dl: (Len: 9)), (fc: (freq: 495); dl: (Len: 9)),
(fc: (freq: 31); dl: (Len: 9)), (fc: (freq: 287); dl: (Len: 9)), (fc: (freq: 159); dl: (Len: 9)),
(fc: (freq: 415); dl: (Len: 9)), (fc: (freq: 95); dl: (Len: 9)), (fc: (freq: 351); dl: (Len: 9)),
(fc: (freq: 223); dl: (Len: 9)), (fc: (freq: 479); dl: (Len: 9)), (fc: (freq: 63); dl: (Len: 9)),
(fc: (freq: 319); dl: (Len: 9)), (fc: (freq: 191); dl: (Len: 9)), (fc: (freq: 447); dl: (Len: 9)),
{85} (fc: (freq: 127); dl: (Len: 9)), (fc: (freq: 383); dl: (Len: 9)), (fc: (freq: 255); dl: (Len: 9)), //255
(fc: (freq: 511); dl: (Len: 9)), (fc: (freq: 0); dl: (Len: 7)), (fc: (freq: 64); dl: (Len: 7)),
(fc: (freq: 32); dl: (Len: 7)), (fc: (freq: 96); dl: (Len: 7)), (fc: (freq: 16); dl: (Len: 7)),
(fc: (freq: 80); dl: (Len: 7)), (fc: (freq: 48); dl: (Len: 7)), (fc: (freq: 112); dl: (Len: 7)),
(fc: (freq: 8); dl: (Len: 7)), (fc: (freq: 72); dl: (Len: 7)), (fc: (freq: 40); dl: (Len: 7)),
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -