Пакет: Побитовый XOR двоичных символов не работает - PullRequest
1 голос
/ 02 мая 2020

У меня есть две нелепо длинные двоичные переменные a и b с предположением, что они имеют одинаковую длину. То, что я хочу, это просто: XOR их и сохранить в новой переменной, вот и все. Когда я сыт по горло различными ошибками, такими как Expression.Convert: Object of type 'System.Int64' cannot be converted to type 'System.Int32' или Value was either too large or too small for a UInt32 или Arithmetic overflow error converting expression to data type int, я сделаю это самостоятельно.

  1. Итерация по частям (символ за символом) через a и b.
  2. бит XOR a с битом b на pos i и объединить этот вновь созданный бит XOR с новой переменной newXorVar

Вот мой код:

@echo off 
setLocal enableDelayedExpansion

set a=01101000011001010110010101000010101010101010101010111010101010101010101010100000000001101111000010101010101101100011011000110111111010101000001
set b=01110111011011110111001001101100011001000010000111011000110010101100101010000101010101010101100011011000110110001100100001010110110001101100011

set pos=0
set newXorVar=""

:NextChar
  ::check if each character can be reached --> okay
  echo Char %pos% is !a:~%pos%,1! and !b:~%pos%,1! 
  ::XOR each bit --> does not work
  set /a xorAB=!a:~%pos%,1!^!b:~%pos%,1!
  ::echo does not work --> not the desired output
  echo !xorAB! 
  newXorVar=!newXorVar!!xorAB!
  set /a pos=pos+1
  if "!a:~%pos%,1!" NEQ "" goto NextChar

::output computed newXOR var
echo !newXorVar!

Кто-нибудь может мне помочь исправить мой код, чтобы он работал?

1 Ответ

0 голосов
/ 03 мая 2020

Как уже указывал пользователь Aacini в его комментарии , проблема вызвана этой строкой:

set /a xorAB=!a:~%pos%,1!^!b:~%pos%,1!

С каретки (^) escape-символ , его необходимо защитить. Это может быть достигнуто путем удвоения или цитирования:

rem // Double the `^` in order to escape itself:
set /a xorAB=!a:~%pos%,1!^^!b:~%pos%,1!
rem // Or quote the whole expression to protect the `^`:
set /a "xorAB=!a:~%pos%,1!^!b:~%pos%,1!"

Однако, поскольку у вас включено отложенное расширение , которое также рассматривает ^ как escape-символ, вам необходимо защитить его еще раз, чтобы сохранить его:

rem // Quadruple the `^` in order to escape itself:
set /a xorAB=!a:~%pos%,1!^^^^!b:~%pos%,1!
rem // Or double it and quote the whole expression to protect them:
set /a "xorAB=!a:~%pos%,1!^^!b:~%pos%,1!"

Подробнее см. в этом разоблачающем потоке: Как синтаксический анализ сценариев Windows Command Interpreter (CMD.EXE)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...