Что нового

AutoIt и двоичный код

Mr. Anderson

Новичок
Сообщения
122
Репутация
4
Как в AutoIt выполнить примерно такие действия:
0101 1101 + 1 = 0101 1110
Записать это всё в файл, так что бы он весил 1 байт (8 бит по результатам вычисления)
Код:
$bA1 = 1011101
$bA2 = 1

$bA3 = $bA1 + $bA2

MsgBox(0, '', $bA3)

Выводит 01011102

Хм... может быть в WinAPI есть такое?
 

SyDr

Сидра
Сообщения
651
Репутация
158
Нет такого в WinAPI (с какой стати оно там будет?)

Вопрос, зачем это надо?

Впрочем, вот пример:
Код:
$b01 = 1011101


While True
	MsgBox(4096, Default, $b01)
	$b01 = NextB($b01)
WENd

Func NextB($String, $Pos = 1)
	If Not IsString($String) Then $String = String($String)
	If $Pos = StringLen($String)+1 Then Return "1" & $String
	If StringMid($String, StringLen($String) - $Pos + 1, 1) = 1 Then
		Return NextB(StringLeft($String, StringLen($String) - $Pos) & "0" & StringRight($String, $Pos - 1), $Pos + 1)
	Else
		Return StringLeft($String, StringLen($String) - $Pos) & "1" & StringRight($String, $Pos - 1)
	EndIf
EndFunc
 
Автор
M

Mr. Anderson

Новичок
Сообщения
122
Репутация
4
Такой вот брут пишу, что бы учесть все возможные значения для каждого байта... А как потом в файл записать?
 

aleratorio

Осваивающий
Сообщения
85
Репутация
42
Код:
$bA1 = '1011101'
$bA2 = '1'

$bA3 = Chr(ByteToInt($bA1) + ByteToInt($bA2))

FileWrite('result.txt', $bA3)

Func ByteToInt($sBytes)
	$iStrLen = Stringlen($sBytes)
	$iRet = 0
	For $i = $iStrLen To 1 Step -1
		If StringMid($sBytes, $i, 1) = '1' Then $iRet += 2^($iStrLen - $i)
	Next
	Return $iRet
EndFunc
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Просто берем и открываем Калькулятор
Вид - Инженерный
и еще Bin
Теперь сложим 1011101 с 1
Получим 10111100
Так???
 

aleratorio

Осваивающий
Сообщения
85
Репутация
42
А что бы MsgBox работал:
Код:
$bA1 = '0010000100100001' ;длина строки максимум 32 символа (32 бита)
$bA2 = '0000100100011011'

$bA3 = IntToByteString(ByteStringToInt($bA1) + ByteStringToInt($bA2))

MsgBox(0, '', $bA3)

$hFile = FileOpen('result.txt', 2)
FileWrite($hFile, ByteStringToAsciiString($bA3))
FileClose($hFile)

Func ByteStringToInt($sBytes)
	$iStrLen = Stringlen($sBytes)
	$iRet = 0
	For $i = $iStrLen To 1 Step -1
		If StringMid($sBytes, $i, 1) = '1' Then $iRet = BitOR($iRet, 2^($iStrLen - $i))
	Next
	Return $iRet
EndFunc

Func IntToByteString($iInt)
	$sRet = ''
	For $i = 0 to 31
		If BitAND($iInt, 2^$i) Then
			$sRet = '1' & $sRet
		Else
			$sRet = '0' & $sRet
		EndIf
	Next
	Return StringRegExpReplace($sRet, '^(0+)', '')
EndFunc

Func ByteStringToAsciiString($sBytes)
	$sRet = ''
	Do
		$sRet = Chr(ByteStringToInt(StringRight($sBytes, 8))) & $sRet
		$sBytes = StringTrimRight($sBytes, 8)
	Until $sBytes = ''
	Return $sRet
EndFunc
 

SyDr

Сидра
Сообщения
651
Репутация
158
Mr. Anderson [?]
А как потом в файл записать?
FileWrite же

Такой вот брут пишу, что бы учесть все возможные значения для каждого байта...
Байта, или чего? Надо же договаривать.
Вот ещё вариант, который намного красивее:

Код:
$iNumber = 92
$sMessage = ""

For $i = 1 To 50
	$iNumber += 1
	$sMessage &= NumberToString2($iNumber, 2 ^ 7) & @TAB & $iNumber & @CRLF
Next

MsgBox(4096, Default, $sMessage)


Func NumberToString2($iNumber, $iType = 128) ; $iNumber - число для перевода, $iType = 2^(x-1), где x - нужное число разрядов
	Local $sResult = ""
	While $iType > 0
		If BitAND($iNumber, $iType) Then
			$sResult &= "1"
		Else
			$sResult &= "0"
;~ 			If $sResult <> "" Then $sResult &= "0" ; если нужен результат без ведущих нулей, можно использовать этот вариант
		EndIf
		$iType = BitShift($iType, 1)
	WEnd
	Return $sResult
EndFunc
 
Автор
M

Mr. Anderson

Новичок
Сообщения
122
Репутация
4
Действительно, хорошо составленный вопрос содержит половину ответа, не смог я описать проблему в первой месаге, попробую сейчас
Код:
For $i = 0 To 255
	$sFileName = @ScriptDir&'/'&$i&'.txt'
	$hFile = FileOpen($sFileName, 2)
	FileWrite($hFile, Binary($i))
	FileClose($hFile)
Next

Как сделать так, что в результате выполнения скрипта получилось 256 разных файлов весом в 1 байт?
 

SyDr

Сидра
Сообщения
651
Репутация
158
Код:
For $i = 0 To 255
	FileWrite($i & ".txt", Chr($i))
Next
 
Верх