;-- TIME_STAMP   2019-03-26 19:16:31   v 1.1

#include-once

; #INDEX# =======================================================================================================================
; Title .........: Manipulating Binary Function Library
; AutoIt Version : 3.3.14.5
; UDF Version ...: 1.1.0.0
; Language ......: English
; Description ...: A collection of functions for manipulating a binary variant.
; Author(s) .....: Bitnugger
; Modified.......: 20190325(YYYMMDD)
; Remarks .......:
; Contributors ..:
; Resources .....:
; ===============================================================================================================================

; #CURRENT# =====================================================================================================================
; _BinaryMidAND
; _BinaryMidNOT
; _BinaryMidOR
; _BinaryMidXOR
; ===============================================================================================================================

; #INTERNAL_USE_ONLY#============================================================================================================
; __BinaryMidBitOp
; ===============================================================================================================================

; #FUNCTION# ====================================================================================================================
; Name ..........: _BinaryMidAND
; Description ...: Performs a bitwise AND operation with one byte from a binary variant.
; Syntax ........: _BinaryMidAND($dBinary, $iMid, $iAND)
; Parameters ....: $dBinary             - a binary variant value.
;                  $iMid                - an integer value.
;                  $iAND                - an integer value.
; Return values .: Success: $dBinary
;                  Failure: None
;                           @error = 1 IsBinary($dBinary) = 0
;                           @error = 2 $iMid < 1 Or $iMid > BinaryLen($dBinary)
;                           @error = 3 Abs($iValue) > 0xFF
; Author ........: Bitnugger
; Modified ......:
; Remarks .......:
; Related .......: BitAND, BitNOT, BitOR, BitXOR
; Link ..........:
; Example .......: YES
; ===============================================================================================================================
Func _BinaryMidAND($dBinary, $iMid, $iAND)
	$dBinary = __BinaryMidBitOp(BitAND, $dBinary, $iMid, $iAND)
	Return SetError(@error, 0, $dBinary)
EndFunc  ;==>_BinaryMidAND

; #FUNCTION# ====================================================================================================================
; Name ..........: _BinaryMidNOT
; Description ...: Performs a bitwise NOT operation with one byte from a binary variant.
; Syntax ........: _BinaryMidNOT($dBinary, $iMid)
; Parameters ....: $dBinary             - a binary variant value.
;                  $iMid                - an integer value.
; Return values .: Success: $dBinary
;                  Failure: None
;                           @error = 1 IsBinary($dBinary) = 0
;                           @error = 2 $iMid < 1 Or $iMid > BinaryLen($dBinary)
;                           @error = 3 Abs($iValue) > 0xFF
; Author ........: Bitnugger
; Modified ......:
; Remarks .......:
; Related .......: BitAND, BitNOT, BitOR, BitXOR
; Link ..........:
; Example .......: YES
; ===============================================================================================================================
Func _BinaryMidNOT($dBinary, $iMid)
	$dBinary = __BinaryMidBitOp(BitNOT, $dBinary, $iMid)
	Return SetError(@error, 0, $dBinary)
EndFunc  ;==>_BinaryMidNOT

; #FUNCTION# ====================================================================================================================
; Name ..........: _BinaryMidOR
; Description ...: Performs a bitwise OR operation with one byte from a binary variant.
; Syntax ........: _BinaryMidOR($dBinary, $iMid, $iOR)
; Parameters ....: $dBinary             - a binary variant value.
;                  $iMid                - an integer value.
;                  $iOR                 - an integer value.
; Return values .: Success: $dBinary
;                  Failure: None
;                           @error = 1 IsBinary($dBinary) = 0
;                           @error = 2 $iMid < 1 Or $iMid > BinaryLen($dBinary)
;                           @error = 3 Abs($iValue) > 0xFF
; Author ........: Bitnugger
; Modified ......:
; Remarks .......:
; Related .......: BitAND, BitNOT, BitOR, BitXOR
; Link ..........:
; Example .......: YES
; ===============================================================================================================================
Func _BinaryMidOR($dBinary, $iMid, $iOR)
	$dBinary = __BinaryMidBitOp(BitOR, $dBinary, $iMid, $iOR)
	Return SetError(@error, 0, $dBinary)
EndFunc  ;==>_BinaryMidOR

; #FUNCTION# ====================================================================================================================
; Name ..........: _BinaryMidXOR
; Description ...: Performs a bitwise XOR operation with one byte from a binary variant.
; Syntax ........: _BinaryMidXOR($dBinary, $iMid, $iXOR)
; Parameters ....: $dBinary             - a binary variant value.
;                  $iMid                - an integer value.
;                  $iXOR                - an integer value.
; Return values .: Success: $dBinary
;                  Failure: None
;                           @error = 1 IsBinary($dBinary) = 0
;                           @error = 2 $iMid < 1 Or $iMid > BinaryLen($dBinary)
;                           @error = 3 Abs($iValue) > 0xFF
; Author ........: Bitnugger
; Modified ......:
; Remarks .......:
; Related .......: BitAND, BitNOT, BitOR, BitXOR
; Link ..........:
; Example .......: YES
; ===============================================================================================================================
Func _BinaryMidXOR($dBinary, $iMid, $iXOR)
	$dBinary = __BinaryMidBitOp(BitXOR, $dBinary, $iMid, $iXOR)
	Return SetError(@error, 0, $dBinary)
EndFunc  ;==>_BinaryMidXOR

; #INTERNAL_USE_ONLY#============================================================================================================
; Name ..........: __BinaryMidBitOp
; Description ...:
; Syntax ........: __BinaryMidBitOp($BitOp, $dBinary, $iMid[, $iValue = ''])
; Parameters ....: $BitOp               - an unknown value.
;                  $dBinary             - a binary variant value.
;                  $iMid                - an integer value.
;                  $iValue              - [optional] an integer value. Default is ''.
; Return values .: Success: $dBinary
;                  Failure: None
;                           @error = 1 IsBinary($dBinary) = 0
;                           @error = 2 $iMid < 1 Or $iMid > BinaryLen($dBinary)
;                           @error = 3 Abs($iValue) > 0xFF
;                           @error = 4 FuncName($BitOp) = '' or <> 'BitAND', 'BitOR', 'BitXOR', 'BitNOT'
; Author ........: Bitnugger
; Modified ......:
; Remarks .......: This function is used internally
; Related .......: BitAND, BitNOT, BitOR, BitXOR
; Link ..........:
; Example .......: YES
; ===============================================================================================================================
Func __BinaryMidBitOp($BitOp, $dBinary, $iMid, $iValue = '')
	If Not IsBinary($dBinary) Then SetError(1, 0, '')
	$iMid = Number($iMid)
	If Not IsInt($iMid) Or $iMid < 1 Or $iMid > BinaryLen($dBinary) Then Return SetError(2, 0, '')
	Local $sOp
	Switch FuncName($BitOp)
		Case 'BitAND', 'BitOR', 'BitXOR'
			$iValue = Number($iValue)
			If Not IsInt($iValue) Or Abs($iValue) > 0xFF Then Return SetError(3, 0, '')
			$sOp = Hex($BitOp(BinaryMid($dBinary, $iMid, 1), $iValue), 2)
		Case 'BitNOT'
			$sOp = Hex($BitOp(BinaryMid($dBinary, $iMid, 1)), 2)
		Case Else
			Return SetError(4, 0, '')
	EndSwitch

	Switch $iMid
		Case 1
			Return Binary('0x' & $sOp & StringMid(BinaryMid($dBinary, 2), 3))
		Case BinaryLen($dBinary)
			Return BinaryLen($dBinary) = 1 ? Binary('0x' & $sOp) : Binary(BinaryMid($dBinary, 1, $iMid -1) & $sOp)
		Case Else
			Return Binary(BinaryMid($dBinary, 1, $iMid - 1) & $sOp & StringMid(BinaryMid($dBinary, $iMid + 1), 3))
	EndSwitch
EndFunc  ;==>__BinaryMidBitOp
