c#序列化ascii混淆
本文关键字:混淆 ascii 序列化 | 更新日期: 2023-09-27 17:59:27
下面是代码。
[Serializable]
public class HostedGame
{
public int ID { get; set; }
public int UID { get; set; }
public String Name { get; set; }
public Boolean Available { get; set; }
public String Description { get; set; }
public List<int> Users { get; set; }
public int Port { get; set; }
public HostedGame(int uid, String name, String description, int port)
{
UID = uid;
Name = name;
Description = description;
Available = true;
Port = port;
Users = new List<int>();
}
public int CompareTo(Object obj)
{
int result = 1;
if(obj != null && obj is HostedGame)
{
HostedGame w = obj as HostedGame;
result = this.ID.CompareTo(w.ID);
}
return result;
}
static public int Compare(HostedGame x, HostedGame y)
{
int result = 1;
if(x != null && y != null)
{
result = x.CompareTo(y);
}
return result;
}
public static HostedGame DeSerialize(byte[] data)
{
MemoryStream ms = new MemoryStream(data);
BinaryFormatter bff = new BinaryFormatter();
return (HostedGame)bff.Deserialize(ms);
}
public static byte[] Serialize(HostedGame obj)
{
BinaryFormatter bff = new BinaryFormatter();
MemoryStream ms = new MemoryStream();
bff.Serialize(ms, obj);
return ms.ToArray();
}
}
下面的代码似乎不正确:
HostedGame hs = new HostedGame(12,"Name", "Description", 8088);
String s = Encoding.ASCII.GetString(HostedGame.Serialize(hs));
HostedGame HACK = HostedGame.DeSerialize(Encoding.ASCII.GetBytes(s));
出于某种原因,HACK.Port
是7999?
当我这么做的时候。。。
HostedGame HACK = HostedGame.DeSerialize(HostedGame.Serialize(hs));
它运行良好。
所以,我要问的是
- 为什么我得到了错误的值
- 有没有更好的方法将字节转换为字符串,然后再转换回来
不能使用Encoding.ASCII.GetString
将任何字节数组转换为字符串。这样做会丢失一些数据。请改用Convert.ToBase64String
。这将从任何字节序列中生成一个字符串,而不会丢失数据。
HostedGame hs = new HostedGame(12,"Name", "Description", 8088);
String s = Convert.ToBase64String(HostedGame.Serialize(hs));
HostedGame HACK= HostedGame.DeSerialize(Convert.FromBase64String(s));
下面是一个示例,显示了使用Encoding.ASCII
如何丢失数据。
var testBytes = new byte[] { 250, 251, 252 };
var text = Encoding.ASCII.GetString(testBytes);
var bytes = Encoding.ASCII.GetBytes(result); // will be 63, 63, 63
二进制序列化生成一个字节数组,该数组在任何编码中都不一定是有效字符串。
当您尝试将其读取为ASCII文本时,ASCII解码器会将任何无效字节(>128)转换为?
字符
因此,当您将其转换回ASCII字节时,最终会得到一组不同的字节。
简而言之,不将二进制数据视为ASCII或任何其他文本编码。
如果需要以纯文本形式发送二进制数据,请使用Base64将其安全地转换为文本。