我有两个长得离谱的二进制变量。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
,我自己会做。
a
和 b
.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!
谁能帮我修改一下我的代码,让它正常工作?
正如用户所指出的 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)是如何解析脚本的?