Ejemplo n.º 1
0
        public bool WriteAbsolute(UIntPtr address, byte[] buffer, EndiannessType endianness)
        {
            int numOfBytes = 0;

            // Safety bounds check
            if (address.ToUInt64() < BaseOffset.ToUInt64() ||
                address.ToUInt64() + (uint)buffer.Length >= BaseOffset.ToUInt64() + _ramSize)
            {
                return(false);
            }

            if (Endianness == endianness)
            {
                return(WriteFunc(address, buffer));
            }
            else
            {
                bool success             = true;
                IEnumerable <byte> bytes = buffer;

                int numberToWrite = Math.Min(EndiannessUtilities.NumberOfBytesToAlignment(address), buffer.Length);
                if (numberToWrite > 0)
                {
                    byte[] toWrite = bytes.Take(numberToWrite).Reverse().ToArray();
                    success &= WriteFunc(EndiannessUtilities.AlignedAddressFloor(address), toWrite);

                    bytes    = bytes.Skip(toWrite.Length);
                    address += toWrite.Length;
                }

                numberToWrite = bytes.Count();
                if (bytes.Count() >= 4)
                {
                    byte[] toWrite = EndiannessUtilities.SwapByteEndianness(bytes.Take(bytes.Count() & ~0x03).ToArray());

                    success &= WriteFunc(address, toWrite);

                    bytes    = bytes.Skip(toWrite.Length);
                    address += toWrite.Length;
                }

                numberToWrite = bytes.Count();
                if (numberToWrite > 0)
                {
                    byte[] toWrite = bytes.Reverse().ToArray();
                    address = EndiannessUtilities.SwapAddressEndianness(address, toWrite.Length);

                    success &= WriteFunc(address, toWrite);
                }

                return(success);
            }
        }