批量。二进制字符的Bitwise XOR不工作。

问题描述 投票:1回答:1

我有两个长得离谱的二进制变量。ab 假设它们具有相同的长度。我想要的很简单。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 UInt32Arithmetic overflow error converting expression to data type int,我自己会做。

  1. 迭代一点一点的(一个字符一个字符的)通过对 ab.
  2. XOR位的 a 带点 b 关于 pos i 并将这个新创建的XORed位连接到一个新的变量上 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!

谁能帮我修改一下我的代码,让它正常工作?

batch-file
1个回答
0
投票

正如用户所指出的 Aacini他的评论,问题是由这一行引起的。

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

因为这行的小括号(^)是 逸字,它需要被保护。可以通过翻倍或引用的方式来实现。

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!"

但是,由于你有 延期扩建 启用,这也是对 ^ 作为逃生人物,你需要再次保护它才能保存下来。

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命令解释器(CMD.EXE)是如何解析脚本的?

© www.soinside.com 2019 - 2024. All rights reserved.