musicstashall
Знающий
- Сообщения
- 322
- Репутация
- 7
Имеется бинарная строка, в которой присутствуют различные SOH, EOT, SO, DC1, DC2... и прочие ненужные Управляющие символы, кроме LF и CR разумеется. Строку нужно порезать в массив по нулевым байтам (NUL - Chr(0)), плюс потом каждую подстроку еще по символам SOH - Chr(1), чтобы получить массив чистых строк. Если в строке остаются только числа, удаляем строку, если остается один символ, тоже удаляем строку. Я топорным способом реализовал фильтрацию, но хотелось бы ускорить процесс с помощью регулярных выражений. Прошу помощи знатаков.
Код:
#include <Array.au3>
#include <WinAPIConv.au3>
Global $sBytes = '0x5303000004000300280028006D018A02437573746F6D20456C656D656E74204C617965722053657474696E6773001C0001000100070027016A0246001400000000004F4B00020001000700D7006A02460014000000000043616E63656C0003001300000005000500630116000101000003000500000000000400010007000500230064001400000000004E6577000500010007008400230064001400000000004475706C69636174650006000100070004012300640014000000000044656C6574650007000F000000000041006D01020008000D00000405004800620112000000100053696E676C65206C617965722073657474696E67730009000D00000405008C00C9001200000000004261736564206F6E3A000A0013000000D2008900950016000101000003000500000000000B000D0000040500AB00CA001200000000004C617965722049443A000C000C000000D200A7009600170000001F000D000C0000007500C300320017000000FF000E000C000600AB00C3003200170000002D3130302E30003130302E30000F000C0003009800A5003200170000002D393939393939392E3000393939393939392E3000100013000000960091003200160001010000030005000000000011000D0000040500C400C80012000000000053657474696E677320746F2074656D706C6174653A001200040001000500DA006801810000001200000013000F000000000065016D01020014000100070084007101640014000000000053657474696E67732E2E2E00150001000700040171016400140000000000526573657400160002000100050076016400120000004F7074696F6E206E616D650017000D00000405007601790012000000000044656661756C74206F7074696F6E733A0018000400010005008B016801D20000001200000019000D00000805005D02C7002C0000000400001A00020001000500700061011200000054686973207479706520697320617661696C61626C65206F6E6C7920666F722063757272656E742070726F6A6563742066696C65001B000200010005005D00610112000000456E61626C652065646974696E672028636865636B20746F20656469742063757272656E74206974656D29001C0001000700D200C40096001200040000005765696768742073657474696E67732E2E2E00'
Global $sBytes2 = '0xB00100000100000000000000FA0013014A6F696E20656E6473000B000100010007000500E000F000140000000000446F2028416C742B33290002000D0000040500BE004B001200000000004761703A0003000C0006006F00BC006400170000002D393939392E3000393939392E300004000D00000005001800ED0028000000040000050001000700050045009E00140000000000476574206D6172717565652028416C742B322900060001000700A80045004B0014000000000053686F770007000D00000005006200EF00390000000400506C616E6B73206D75737420696E7465727365637420696E73696465206D6172717565652E2054686520656E6420696E73696465206D6172717565652077696C6C206265207072657365727665642E20576974686F7574206D61727175656520746865206C6F6E67657220656E642077696C6C206265207072657365727665642E0008000D00000005000500F0001200000010004F7065726174696F6E20746172676574730009000D0000040500A700F40014000000100053657474696E67733A000A000F0000000000A000FA0002000B000D0000040500FC00F00014000000040000'
Global $sBytes3 = '0xA60100000100000000000000FA000B01786C73636E63000C0001000D0000040400EF00F000140000000400000200010007009100470064001400000000005175616E7469746965732E2E2E0003000100070091008D006400140000000000434E432E2E2E0004000D00000405000400F4001400000010004C697374696E67733A00050013000000050045008200180001010000030005000000000006000300010005001A00F0001200010000004163746976652073746F7265790007000300010005002F00F00012000100000057686F6C65206D6F64656C0008001300000005008B00820018000101000003000500000000000900010007000500B400F0001400000000005072696E74696E6720616E64206C61796F7574732E2E2E000A000D000004050071008100120000000000434E432D5772697465723A000B001300000091006D00640018000101000003000500000000000C00010006000500D100F00014000000FFFF436865636B20666F7220646F75626C65737C53656C65637420616C6C2062757420746865206C61746573742066726F6D206964656E746963616C20646F75626C657300'
Global $NameIndex = 1, $sTypeIndex = 1, $Enc = 4
_ArrayDisplay(BytesToArray($sBytes))
Func BytesToArray($sBytes, $iFlag = 1)
Local $sStrsOld = BinaryToString($sBytes)
Local $aStrs = StringSplit($sStrsOld, Chr(0))
Local $aData[$aStrs[0]][3] = [[0]], $iIndex = 0
For $i = 1 To $aStrs[0]
If $iFlag Then
StrFilter($aStrs[$i])
If Not $aStrs[$i] Then ContinueLoop
EndIf
$iIndex += 1
$aData[$iIndex][0] = $i
$aData[$iIndex][1] = str(bin($aStrs[$i], 1))
Next
ReDim $aData[$iIndex + 1][3]
$aData[0][0] = UBound($aData) -1
$aData[0][1] = _WinAPI_MakeLong($NameIndex, $sTypeIndex)
$aData[0][2] = $aStrs[0]
Return $aData
EndFunc
Func StrFilter(ByRef $str)
Local $SOH = StringSplit($str, Chr(1)), $Data, $st = '', $s = ''
For $i = 1 To $SOH[0]
$Data = StringToASCIIArray($SOH[$i])
For $j = 0 To UBound($Data) -1
If $j = UBound($Data) Then ExitLoop
Switch $Data[$j]
Case 0 To 8, 12, 14 To 31, 127, 160, 152, 256 To 1024, 1040 To 1055, 1058 To 1104, 1120 To 1167, 1170 To 8210, 8219, 8223, _
8227 To 8229, 8231 To 8239, 8241 To 8248, 8251 To 8363, 8365 To 8469, 8471 To 8481, 8483 To 1000000
_ArrayDelete($Data, $j)
$j -= 1
Case Else
EndSwitch
Next
$s = StringFromASCIIArray($Data)
If UBound($Data) And StringLen($s) > 1 Then $st &= $s
Next
$str = $st
If StringIsDigit($str) Then $str = ''
If StringIsFloat($str) Then $str = ''
EndFunc
Func str($aBinary, $encoding = $Enc)
Return BinaryToString($aBinary, $encoding)
EndFunc
Func bin($string, $encoding = $Enc)
Return StringToBinary($string, $encoding)
EndFunc
Последнее редактирование: