ClearAll["`*"]
SetAttributes[readData,HoldFirst];
readData[array_]:=Block[{fin,opcode,maskkey,length,start,data},
fin=BitAnd[array[[1]],128(*0x80*)]!=0;
opcode=BitAnd[array[[1]],15(*0x0f*)];
(*计算数据长度和开始位置*)
start=3;
Switch[length=BitAnd[array[[2]],127(*0x7f*)],
126,start=5;length=256*array[[3]]+array[[4]],
127,start=7;length={16777216,65536,256,1}.array[[3;;6]]];
(*掩码处理*)
If[BitAnd[array[[2]],128(*0x80*)]!=0,
maskkey=RotateRight@array[[start;;start+3]];
start+=3;
Do[array[[start+i]]=BitXor[array[[start+i]],maskkey[[i~Mod~4+1]]],{i,1,length}]];
Return[<|"FIN"->fin,"opcode"->opcode,"PayloadLength"->length,"PayloadData"->FromCharacterCode@array[[start+1;;]]|>]]
a=ToExpression["16^^"<>#&/@StringPartition["8189b023525a8111616e8515656289",2]]
readData[a]
暂时不写说明了 全部完成后再补