2014-10-29 261 views
1

我想将以二进制形式存储的密码转换为正常的ASCII形式,以便我可以读取它。我需要的是一个VBScript和脚本还应该返回该解加密的密码将二进制转换为字符串

如:加密的二进制密码:00110001 00110010 00110011 00110100

德加密后的原始密码:1234

我想这

'Binary contains the binary password 
dim S 
For I = 1 To LenB(Binary) 
S = S & Chr(AscB(MidB(Binary, I, 1))) 
Next 
MSGBOX S 

但输出

0 

如何做到这一点。请帮忙!!

+1

即二进制不以任何方式 “加密”。另外,“以二进制存储”甚至是什么意思?你不能用二进制存储任何东西。或者,表达方式不同,*所有*都以二进制形式存储在计算机中。那么,它是什么?一个字节数组?它从何而来?如果它是一个字节数组,它代表了哪种字符编码? – Tomalak 2014-10-29 07:43:00

回答

0

如果我是对的,你所要做的就是将二进制数转换为十进制数(例如0100 - > 4)?

dim binary, n, s 
binary= "00110001" 

For s = 1 To Len(binary) 
    n = n + (Mid(binary, Len(binary) - s + 1, 1) * (2^(s - 1))) 
Next 's 

WScript.Echo binary & " = " & n 

输出

00110001 = 49

从这里转换:http://www.vb-helper.com/howto_decimal_to_binary.html

+0

这个答案完全是误导。 “加密”不是“在转换为二进制之前将每个数字加48”。这就是所谓的ASCII。字符“1”的ASCII代码是49.所以你的对话代码是错误的,并且对于ASCII范围以外的字符(除01111111之外的所有字符,即二进制中的127)都是平坦的。 @安南你真的,真的不应该使用这个答案。 – Tomalak 2014-10-29 10:06:18

+0

@Tomalak我会删除最后一位然后 – 2014-10-29 10:08:02

+0

但很抱歉,这并没有让你的答案正确,但。 ;-) – Tomalak 2014-10-29 10:08:57

2

试试这个代码;)

代码:

function BinaryToString(bin) 
dim next_char 
dim result 
dim i 
dim ascii 
For i = 1 To Len(bin) + 18 Step 8 
     next_char = Mid(bin, i, 8) 
     ascii = BinaryToLong(next_char) 
     result = result & Chr(ascii) 
    Next 
    BinaryToString=result 
end function 

Function BinaryToLong(binary_value) 
Dim hex_result 
Dim nibble_num 
Dim nibble_value 
Dim factor 
Dim bit 

    binary_value = UCase(Trim(binary_value)) 
    If Left(binary_value, 2) = "&B" Then 
     binary_value = Mid(binary_value, 3) 
    End If 

    binary_value = Replace(binary_value, " ", "") 
    binary_value = Right(String(32, "0") & binary_value, 32) 

    For nibble_num = 7 To 0 Step -1 
     factor = 1 
     nibble_value = 0 

     For bit = 3 To 0 Step -1 
      If Mid(binary_value,1 + nibble_num * 4 + bit, 1) = "1" Then 
       nibble_value = nibble_value + factor 
      End If 
      factor = factor * 2 
     Next 'bit 

     hex_result = Hex(nibble_value) & hex_result 
    Next 'nibble_num 

    BinaryToLong = CLng("&H" & hex_result) 
End Function 

用法:

response.Write(BinaryToString("00110001001100100011001100110100")) 

不要忘了从二进制字符串腾飞 “” 空格

+0

请不要发布两个答案。 (你可以发布两个答案,但是发布代码*你写了*,以及解释,而不是你在互联网上找到的代码。这不是成就。) – Tomalak 2014-10-29 07:57:04

+0

我试图删除第一个,但是我不能,不知道为什么 – 2014-10-29 08:08:39

+0

你应该能够删除自己的帖子(就像你可以编辑它们一样)。当你试图删除它时,你看到错误信息吗? – Tomalak 2014-10-29 08:14:21

-3

有很多方法。

如果它再从帮助一个二进制值REG(你没有读它,没有你)

的RegRead方法返回以下五种类型的值。

Type Description In the Form of 
REG_SZ 
A string 
A string 

REG_DWORD 
A number 
An integer 

REG_BINARY 
A binary value 
A VBArray of integers 

REG_EXPAND_SZ 
An expandable string (e.g., "%windir%\\calc.exe") 
A string 

REG_MULTI_SZ 
An array of strings 
A VBArray of strings 

如果一个字符串,在空间上分割(给你一个字符串数组)。最低有效位是2^0,2^1,...,2^7。


编辑


正常的方式,但不是唯一的方式,来存储密码,是转储它在注册表中。

阅读它给你一个数组,而不是一个标量变量。所以...

第二种方法处理存储在文件中的情况。

4

如果您正在处理字节数组,您必须先知道字符编码,然后才能将其转换为字符串。没有这些知识,字节将被转换为错误的字符。

ADODB.Stream object可以处理字节数组。这里是一个函数,做的是:

Const adTypeBinary = 1 
Const adTypeText = 2 
Const adModeReadWrite = 3 

Function BytesToString(bytes, charset) 
    With CreateObject("ADODB.Stream") 
     .Mode = adModeReadWrite 
     .Type = adTypeBinary 
     .Open 
     .Write bytes 
     .Position = 0 
     .Type = adTypeText 
     .Charset = charset 
     BytesToString = .ReadText 
    End With 
End Function 

这里是如何使用它:

MsgBox BytesToString(binary, "Windows-1252") 

为了完整起见,这是反向操作:

Function StringToBytes(str, charset) 
    With CreateObject("ADODB.Stream") 
     .Mode = adModeReadWrite 
     .Type = adTypeText 
     .Charset = charset 
     .Open 
     .WriteText str 
     .Position = 0 
     .Type = adTypeBinary 
     StringToBytes = .Read 
    End With 
End Function 

由于您的输入似乎是字符串"00110001 00110010 00110011 00110100",她e是将其转换成一个字节数组,然后你就可以用BytesToString()使用上面的函数:

Function BinaryStringToBytes(binaryStr) 
    Dim b, n, i, l 

    l = GetLocale 
    SetLocale 1031 

    With CreateObject("ADODB.Stream") 
     .Mode = adModeReadWrite 
     .Charset = "Windows-1252" 
     .Type = adTypeText 
     .Open 
     For Each b In Split(binaryStr, " ") 
      If Len(b) <> 8 Or Replace(Replace(b, "0", ""), "1", "") <> "" Then 
       ' invalid procedure call or argument 
       Err.Raise 5, "BinaryStringToBytes", _ 
        "Only stings of 8-blocks of 0s and 1s, " & _ 
        "separated by a single space are accepted." 
      End If 
      n = 0 
      For i = 0 To 7 
       n = n + Mid(b, 8 - i, 1) * 2^i 
      Next 
      .WriteText Chr(n) 
     Next 
     .Position = 0 
     .Type = adTypeBinary 
     BinaryStringToBytes = .Read 
    End With 

    SetLocale l 
End Function 

使用

Dim input, output 

input = "00110001 00110010 00110011 00110100" 
output = BytesToString(BinaryStringToBytes(input), "Windows-1252") 

MsgBox output ' -> "1234" 

而且,更重要的是,它能够正确处理多字节编码:

input = "00110001 00110010 00110011 00110100 11000011 10100100" 
output = BytesToString(BinaryStringToBytes(input), "UTF-8") 

MsgBox output ' -> "1234ä" 
相关问题