private static void checkSequenceError(byte[] bytes, string start, string expected) { if (BinaryAscii.hexFromBinary(bytes).Substring(0, start.Length) != start) { throw new ArgumentException( "wanted sequence " + expected.Substring(0, 2) + ", got " + extractFirstInt(bytes).ToString("X") ); } }
public static Tuple <BigInteger, byte[]> removeInteger(byte[] bytes) { checkSequenceError(bytes, hexB, "02"); Tuple <int, int> readLengthResult = readLength(Bytes.sliceByteArray(bytes, 1)); int length = readLengthResult.Item1; int lengthLen = readLengthResult.Item2; byte[] numberBytes = Bytes.sliceByteArray(bytes, 1 + lengthLen, length); byte[] rest = Bytes.sliceByteArray(bytes, 1 + lengthLen + length); int nBytes = numberBytes[0]; if (nBytes >= hex128) { throw new ArgumentException("first byte of integer must be < 128"); } return(new Tuple <BigInteger, byte[]> ( BinaryAscii.numberFromHex(BinaryAscii.hexFromBinary(numberBytes)), rest )); }
private static Tuple <int, int> readLength(byte[] bytes) { int num = extractFirstInt(bytes); if ((num & hex128) == 0) { return(new Tuple <int, int>(num & hex127, 1)); } int lengthLen = num & hex127; if (lengthLen > bytes.Length - 1) { throw new ArgumentException("ran out of length bytes"); } return(new Tuple <int, int>( int.Parse( BinaryAscii.hexFromBinary(Bytes.sliceByteArray(bytes, 1, lengthLen)), System.Globalization.NumberStyles.HexNumber ), 1 + lengthLen )); }