当我尝试使用csc.exe通过命令提示符编译此类时,每次都出现错误“'当前上下文中不存在'Gutils'”。怎么了?怎么会解决这个问题呢?我正在使用.Net Framework 3.5。
此类应编码/解码PlayerID,UserID,ProductID和Timestamp:
namespace GameSpy.Util
{
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
public class LoginTicket
{
private static byte[] LOGIN_TICKET_KEY = new byte[] { 0x8b, 0xad, 0x91, 0xac, 0xeb, 3, 0x71, 0xb9, 150, 0x53, 0xa8, 0x33, 0xe4, 0xf5, 0x2c, 0x2c };
private static ushort Crc16(byte[] input)
{
int num = 0;
foreach (byte num2 in input)
{
num = ((byte) (num >> 8)) | (num << 8);
num ^= num2;
num ^= ((byte) (num & 255)) >> 4;
num ^= (num << 8) << 4;
num ^= ((num & 255) << 4) << 1;
}
return (ushort) num;
}
public static string CreateLoginTicket(int userID, int profileID, ushort productID)
{
RijndaelManaged managed = new RijndaelManaged();
managed.IV = new byte[16];
managed.KeySize = 128;
managed.Key = LOGIN_TICKET_KEY;
managed.Mode = CipherMode.CBC;
managed.Padding = PaddingMode.None;
MemoryStream stream = new MemoryStream(16);
CryptoStream stream2 = new CryptoStream(stream, managed.CreateEncryptor(), CryptoStreamMode.Write);
MemoryStream output = new MemoryStream(16);
BinaryWriter writer = new BinaryWriter(output);
writer.Write(Gutils.UTCSeconds());
writer.Write(userID);
writer.Write(profileID);
writer.Write(productID);
writer.Write(Crc16(output.ToArray()));
stream2.Write(output.ToArray(), 0, (int) output.Length);
stream2.FlushFinalBlock();
return B64Helper.StandardBase64ToSafeBase64(B64Helper.EncodeToString(stream.ToArray()));
}
public static void DecodeLoginTicket(string ticket, out int userID, out int profileID, out ushort productID, out DateTime timeStamp)
{
byte[] buffer = B64Helper.DecodeFromString(B64Helper.SafeBase64ToStandardBase64(ticket));
RijndaelManaged managed = new RijndaelManaged();
managed.IV = new byte[16];
managed.KeySize = 128;
managed.Key = LOGIN_TICKET_KEY;
managed.Mode = CipherMode.CBC;
managed.Padding = PaddingMode.None;
MemoryStream stream = new MemoryStream(buffer.Length);
CryptoStream stream2 = new CryptoStream(stream, managed.CreateDecryptor(), CryptoStreamMode.Write);
stream2.Write(buffer, 0, buffer.Length);
stream2.FlushFinalBlock();
stream.Seek(0L, SeekOrigin.Begin);
BinaryReader reader = new BinaryReader(stream);
int seconds = reader.ReadInt32();
userID = reader.ReadInt32();
profileID = reader.ReadInt32();
productID = reader.ReadUInt16();
ushort num2 = reader.ReadUInt16();
stream.SetLength(14L);
ushort num3 = Crc16(stream.ToArray());
if (num2 != num3)
{
throw new CryptographicException("Invalid CRC value");
}
timeStamp = Gutils.UTCSecondsToDateTime(seconds);
}
}
}
这是另一段代码:
namespace GameSpy.Util
{
using System;
using System.Security.Cryptography;
using System.Text;
public class B64Helper
{
public static byte[] Decode(byte[] inputBuffer)
{
return Decode(inputBuffer, 0, inputBuffer.Length);
}
public static byte[] Decode(byte[] inputBuffer, int inputOffset, int inputCount)
{
FromBase64Transform transform = new FromBase64Transform();
return transform.TransformFinalBlock(inputBuffer, inputOffset, inputCount);
}
public static byte[] DecodeFromString(string input)
{
return Decode(Encoding.ASCII.GetBytes(input));
}
public static byte[] Encode(byte[] inputBuffer)
{
return Encode(inputBuffer, 0, inputBuffer.Length);
}
public static byte[] Encode(byte[] inputBuffer, int inputOffset, int inputCount)
{
ToBase64Transform transform = new ToBase64Transform();
int num = (inputCount / 3) * 4;
if ((inputCount % 3) != 0)
{
num += 4;
}
byte[] outputBuffer = new byte[num];
int num2 = 0;
for (int i = 0; num2 < inputCount; i += 4)
{
int num5 = Math.Min(3, inputCount - num2);
if (num5 == 3)
{
int num4 = transform.TransformBlock(inputBuffer, inputOffset + num2, num5, outputBuffer, i);
}
else
{
transform.TransformFinalBlock(inputBuffer, inputOffset + num2, num5).CopyTo(outputBuffer, i);
}
num2 += 3;
}
return outputBuffer;
}
public static string EncodeToString(byte[] inputBuffer)
{
return EncodeToString(inputBuffer, 0, inputBuffer.Length);
}
public static string EncodeToString(byte[] inputBuffer, int inputOffset, int inputCount)
{
byte[] bytes = Encode(inputBuffer, inputOffset, inputCount);
return Encoding.ASCII.GetString(bytes);
}
public static string SafeBase64ToStandardBase64(string b64str)
{
StringBuilder builder = new StringBuilder(b64str);
builder.Replace('_', '=');
builder.Replace('[', '+');
builder.Replace(']', '/');
return builder.ToString();
}
public static string StandardBase64ToSafeBase64(string b64str)
{
StringBuilder builder = new StringBuilder(b64str);
builder.Replace('=', '_');
builder.Replace('+', '[');
builder.Replace('/', ']');
return builder.ToString();
}
}
}
代码的第二部分:
namespace GameSpy.Util
{
using System;
using System.Collections;
using System.IO;
public sealed class Gutils
{
public static DateTime UTCSecondsToDateTime(int seconds)
{
return TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1) + new TimeSpan(0, 0, seconds));
}
}
}
public static uint UTCSeconds()
{
TimeSpan span = (TimeSpan) (DateTime.UtcNow - new DateTime(0x7b2, 1, 1, 0, 0, 0, 0));
return (uint) span.TotalSeconds;
}
文件路径:
答案 0 :(得分:2)
您需要告诉csc.exe
您要编译哪些文件。由于您的Gutil
类显然位于gutils.cs
而不是LoginTicket.cs
,因此当您仅编译LoginTicket.cs
时,编译器无法找到它。
试试这个:
csc.exe LoginTicket.cs Gutils.cs
甚至
csc.exe *.cs
使用
csc.exe /?
获取更多命令行选项(例如通过子目录等递归...)
进一步阅读:RxBinding