public static byte[] PackRpcDefinition(NtRpcDefinition def, out UIntPtr packedLen) { WireEncoder enc = new WireEncoder(); enc.Write8((byte)def.Version); enc.WriteString(def.Name); int paramsSize = def.ParamsArray.Length; if (paramsSize > 0xff) paramsSize = 0xff; enc.Write8((byte)paramsSize); for (int i = 0; i < paramsSize; ++i) { enc.WriteType(def.ParamsArray[i].Value.Type); enc.WriteString(def.ParamsArray[i].Name); enc.WriteValue(def.ParamsArray[i].Value); } int resultsSize = def.ResultsArray.Length; if (resultsSize > 0xff) resultsSize = 0xff; enc.Write8((byte)resultsSize); for (int i = 0; i < resultsSize; ++i) { enc.WriteType(def.ResultsArray[i].Type); enc.WriteString(def.ResultsArray[i].Name); } packedLen = (UIntPtr)enc.Buffer.Length; return enc.Buffer; }
public void TestWriteString() { WireEncoder e = new WireEncoder(); e.WriteString(s_normal); Assert.That(e.Error, Is.Null); Assert.That(e.Buffer.Length, Is.EqualTo(6)); Assert.That(e.Buffer, Is.EquivalentTo(new byte[] { 0x05, (byte)'h', (byte)'e', (byte)'l', (byte)'l', (byte)'o' })); e.Reset(); e.WriteString(s_long); Assert.That(e.Error, Is.Null); Assert.That(e.Buffer.Length, Is.EqualTo(130)); byte[] arr = new[] {e.Buffer[0], e.Buffer[1], e.Buffer[2], e.Buffer[3]}; Assert.That(arr, Is.EquivalentTo(new byte[] {0x80, 0x01, (byte)'*', (byte) '*'})); Assert.That(e.Buffer[128], Is.EqualTo((byte)'*')); Assert.That(e.Buffer[129], Is.EqualTo((byte)'x')); e.Reset(); e.WriteString(s_big); Assert.That(e.Error, Is.Null); Assert.That(e.Buffer.Length, Is.EqualTo(65540)); arr = new[] { e.Buffer[0], e.Buffer[1], e.Buffer[2], e.Buffer[3] }; Assert.That(arr, Is.EquivalentTo(new byte[] { 0x81, 0x80, 0x04, (byte)'*'})); Assert.That(e.Buffer[65536], Is.EqualTo((byte)'*')); Assert.That(e.Buffer[65537], Is.EqualTo((byte)'x')); Assert.That(e.Buffer[65538], Is.EqualTo((byte)'x')); Assert.That(e.Buffer[65539], Is.EqualTo((byte)'x')); }