mirror of
https://github.com/mm201/pkmn-classic-framework.git
synced 2026-04-13 12:26:07 -05:00
114 lines
2.8 KiB
C#
114 lines
2.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.IO;
|
|
|
|
namespace PkmnFoundations.Support
|
|
{
|
|
public class EncodedString5
|
|
{
|
|
public EncodedString5(byte[] data)
|
|
{
|
|
RawData = data;
|
|
}
|
|
|
|
public EncodedString5(byte[] data, int start, int count)
|
|
{
|
|
if (data.Length < start + count) throw new ArgumentOutOfRangeException("count");
|
|
|
|
byte[] trim = new byte[count];
|
|
Array.Copy(data, start, trim, 0, count);
|
|
AssignData(trim);
|
|
}
|
|
|
|
public EncodedString5(String text)
|
|
{
|
|
Text = text;
|
|
}
|
|
|
|
// todo: Use pointers for both of these
|
|
public static string DecodeString(byte[] data, int start, int count)
|
|
{
|
|
if (data.Length < start + count) throw new ArgumentOutOfRangeException("count");
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
for (int i = start; i < start + count * 2; i += 2)
|
|
{
|
|
ushort gamecode = BitConverter.ToUInt16(data, i);
|
|
if (gamecode == 0xFFFF) { break; }
|
|
sb.Append((char)gamecode);
|
|
}
|
|
|
|
return sb.ToString();
|
|
}
|
|
|
|
public static String DecodeString(byte[] data)
|
|
{
|
|
return DecodeString(data, 0, data.Length);
|
|
}
|
|
|
|
public static byte[] EncodeString(string str)
|
|
{
|
|
MemoryStream m = new MemoryStream(str.Length * 2 + 2);
|
|
foreach (char c in str.ToCharArray())
|
|
{
|
|
m.Write(BitConverter.GetBytes(c), 0, 2);
|
|
}
|
|
m.WriteByte(0xff);
|
|
m.WriteByte(0xff);
|
|
return m.ToArray();
|
|
}
|
|
|
|
private byte[] m_raw_data;
|
|
private string m_text;
|
|
|
|
public string Text
|
|
{
|
|
get
|
|
{
|
|
if (m_text == null && m_raw_data == null) return null;
|
|
if (m_text == null) m_text = DecodeString(m_raw_data);
|
|
return m_text;
|
|
}
|
|
set
|
|
{
|
|
AssignText(value);
|
|
}
|
|
}
|
|
|
|
public byte[] RawData
|
|
{
|
|
get
|
|
{
|
|
if (m_raw_data == null && m_text == null) return null;
|
|
if (m_raw_data == null) m_raw_data = EncodeString(m_text);
|
|
return m_raw_data.ToArray();
|
|
}
|
|
set
|
|
{
|
|
AssignData(value.ToArray());
|
|
}
|
|
}
|
|
|
|
// lazy evaluate these conversions since they're slow
|
|
private void AssignData(byte[] data)
|
|
{
|
|
m_raw_data = data;
|
|
m_text = null;
|
|
}
|
|
|
|
private void AssignText(String text)
|
|
{
|
|
m_text = text;
|
|
m_raw_data = null;
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
return Text;
|
|
}
|
|
}
|
|
}
|