非常奇怪的字符串转换的问题(有图有真相)

时间:2023-01-11 17:31:11
   s = Encoding.Unicode.GetString(EnBt)   ‘从字节enbt中读取字符串,最后两个字节的值是182, 216
   Bt = Encoding.Unicode.GetBytes(s)   ’转换成字符串后,再转换成字节,最后的两个字节变成253,255,其余和enbt的相同正常。这是怎么回事呢?

非常奇怪的字符串转换的问题(有图有真相)
请高手看看

13 个解决方案

#1


没出现:
非常奇怪的字符串转换的问题(有图有真相)

#2


我测试的结果是 当字符串短的时候,是正常的,长的时候最后两个字节就出问题了。
主要过程是 字符串 转换为 字节 加密, 解密时 字符串先转换为字节,再解密,输入107个a来测试,解密是正常的,当a的个数为108时就出问题了,解密后最后多了一个乱码,前面是107个a。

#3


把 你 的 EnBt 发过来 试试

#4


等看结果,6个字符

#5


引用 2 楼 w12wangbo 的回复:
主要过程是 字符串 转换为 字节 加密, 解密时 字符串先转换为字节,再解密,

解密时,应该是 对字节解密, 将字节转换为字符串。
加密/解密完全不匹配么!

#6


引用 5 楼 Tiger_Zhao 的回复:
Quote: 引用 2 楼 w12wangbo 的回复:
主要过程是 字符串 转换为 字节 加密, 解密时 字符串先转换为字节,再解密,

解密时,应该是 对字节解密, 将字节转换为字符串。
加密/解密完全不匹配么!


呵呵! Tiger_Zhao 说得对。

对字节为对象加密,当然,也应该从字节开始解密,然后转换成字符串。

#7


加密过程:字符串转换为字节加密,再转换为字符串,
解密过程:字符串到字节,解密,再转换为字符串。当然是这个过程。
上源代码,用异或加解密(107个a加密后解密正常,108个a解密就异常了。)
 Public Function EnCryptStr(ByVal s As String) As String   ’加密过程
        Dim Bt() As Byte = Encoding.Unicode.GetBytes(s)
        Dim i, j As Int32
        Dim EnBt(Bt.Length - 1) As Byte   '8位1111 1111=十进制数255
        For i = 0 To Bt.Length - 1
            j = i + 1
            EnBt(i) = Bt(i) Xor (j Mod 255)  
        Next
        Return Encoding.Unicode.GetString(EnBt)  
    End Function  

    Public Function DeCryptStr(ByVal s As String) As String  ‘解密过程
        Dim Bt() As Byte = Encoding.Unicode.GetBytes(s)  
        Dim i, j As Int32
        Dim DeBt(Bt.Length - 1) As Byte
        For i = 0 To Bt.Length - 1
            j = i + 1
            DeBt(i) = Bt(i) Xor (j Mod 255)
        Next
        Return Encoding.Unicode.GetString(DeBt)
    End Function  

#8


谁告诉你 字节->字符串->字节 这个过程是始终不变的?
Unicode用2个字节存放编码   全部的2字节编码都是合法的Unicode。
Dim EnBt() As Byte = {182, 216}
Debug.Print(BitConverter.ToString(EnBt))

Dim s = Encoding.Unicode.GetString(EnBt)

Dim Bt() As Byte = Encoding.Unicode.GetBytes(s)
Debug.Print(BitConverter.ToString(Bt))

B6-D8
FD-FF

#9


换换编码格式即可
用Encoding.UTF8.GetBytes

#10


想了想用Encoding.UTF8.GetBytes也不是办法,
应该
Public Function EnCryptStr(ByVal s As String) As Byte()   '加密过程
        Dim Bt() As Byte = UTF8Encoding.UTF8.GetBytes(s)
        Dim i, j As Int32
        Dim EnBt(Bt.Length - 1) As Byte   '8位1111 1111=十进制数255
        For i = 0 To Bt.Length - 1
            j = i + 1
            EnBt(i) = Bt(i) Xor (j Mod 255)
        Next
        Return (EnBt)
    End Function

 Public Function DeCryptStr(ByVal Bt() As Byte) As String  '解密过程
        Dim i, j As Int32
        Dim DeBt(Bt.Length - 1) As Byte
        For i = 0 To Bt.Length - 1
            j = i + 1
            DeBt(i) = Bt(i) Xor (j Mod 255)
        Next
        Return UTF8Encoding.UTF8.GetString(DeBt)
    End Function

#11


自己写个加解密的算法好了,这样格式转换不靠谱。
最简单的例如什么:置换加密、位移加密
反正你自己琢磨个可逆的步骤,应该还是有效果。不要这么干

#12


我曾经想过是不是出问题的2字节Unicode编码是合法的,结果没深入研究,谢谢大家。

#13


字节内容要么用字节格式存放,要么就用Base64编码转字符串。

#1


没出现:
非常奇怪的字符串转换的问题(有图有真相)

#2


我测试的结果是 当字符串短的时候,是正常的,长的时候最后两个字节就出问题了。
主要过程是 字符串 转换为 字节 加密, 解密时 字符串先转换为字节,再解密,输入107个a来测试,解密是正常的,当a的个数为108时就出问题了,解密后最后多了一个乱码,前面是107个a。

#3


把 你 的 EnBt 发过来 试试

#4


等看结果,6个字符

#5


引用 2 楼 w12wangbo 的回复:
主要过程是 字符串 转换为 字节 加密, 解密时 字符串先转换为字节,再解密,

解密时,应该是 对字节解密, 将字节转换为字符串。
加密/解密完全不匹配么!

#6


引用 5 楼 Tiger_Zhao 的回复:
Quote: 引用 2 楼 w12wangbo 的回复:
主要过程是 字符串 转换为 字节 加密, 解密时 字符串先转换为字节,再解密,

解密时,应该是 对字节解密, 将字节转换为字符串。
加密/解密完全不匹配么!


呵呵! Tiger_Zhao 说得对。

对字节为对象加密,当然,也应该从字节开始解密,然后转换成字符串。

#7


加密过程:字符串转换为字节加密,再转换为字符串,
解密过程:字符串到字节,解密,再转换为字符串。当然是这个过程。
上源代码,用异或加解密(107个a加密后解密正常,108个a解密就异常了。)
 Public Function EnCryptStr(ByVal s As String) As String   ’加密过程
        Dim Bt() As Byte = Encoding.Unicode.GetBytes(s)
        Dim i, j As Int32
        Dim EnBt(Bt.Length - 1) As Byte   '8位1111 1111=十进制数255
        For i = 0 To Bt.Length - 1
            j = i + 1
            EnBt(i) = Bt(i) Xor (j Mod 255)  
        Next
        Return Encoding.Unicode.GetString(EnBt)  
    End Function  

    Public Function DeCryptStr(ByVal s As String) As String  ‘解密过程
        Dim Bt() As Byte = Encoding.Unicode.GetBytes(s)  
        Dim i, j As Int32
        Dim DeBt(Bt.Length - 1) As Byte
        For i = 0 To Bt.Length - 1
            j = i + 1
            DeBt(i) = Bt(i) Xor (j Mod 255)
        Next
        Return Encoding.Unicode.GetString(DeBt)
    End Function  

#8


谁告诉你 字节->字符串->字节 这个过程是始终不变的?
Unicode用2个字节存放编码   全部的2字节编码都是合法的Unicode。
Dim EnBt() As Byte = {182, 216}
Debug.Print(BitConverter.ToString(EnBt))

Dim s = Encoding.Unicode.GetString(EnBt)

Dim Bt() As Byte = Encoding.Unicode.GetBytes(s)
Debug.Print(BitConverter.ToString(Bt))

B6-D8
FD-FF

#9


换换编码格式即可
用Encoding.UTF8.GetBytes

#10


想了想用Encoding.UTF8.GetBytes也不是办法,
应该
Public Function EnCryptStr(ByVal s As String) As Byte()   '加密过程
        Dim Bt() As Byte = UTF8Encoding.UTF8.GetBytes(s)
        Dim i, j As Int32
        Dim EnBt(Bt.Length - 1) As Byte   '8位1111 1111=十进制数255
        For i = 0 To Bt.Length - 1
            j = i + 1
            EnBt(i) = Bt(i) Xor (j Mod 255)
        Next
        Return (EnBt)
    End Function

 Public Function DeCryptStr(ByVal Bt() As Byte) As String  '解密过程
        Dim i, j As Int32
        Dim DeBt(Bt.Length - 1) As Byte
        For i = 0 To Bt.Length - 1
            j = i + 1
            DeBt(i) = Bt(i) Xor (j Mod 255)
        Next
        Return UTF8Encoding.UTF8.GetString(DeBt)
    End Function

#11


自己写个加解密的算法好了,这样格式转换不靠谱。
最简单的例如什么:置换加密、位移加密
反正你自己琢磨个可逆的步骤,应该还是有效果。不要这么干

#12


我曾经想过是不是出问题的2字节Unicode编码是合法的,结果没深入研究,谢谢大家。

#13


字节内容要么用字节格式存放,要么就用Base64编码转字符串。