126 lines
3.2 KiB
C#
126 lines
3.2 KiB
C#
//------------------------------------------------------------------------------
|
|
// Copyright (c) Microsoft Corporation. All Rights Reserved.
|
|
//------------------------------------------------------------------------------
|
|
|
|
namespace Microsoft.VisualStudio.WebHost
|
|
{
|
|
using System;
|
|
using System.Collections;
|
|
using System.Text;
|
|
|
|
internal sealed class ByteString {
|
|
private byte[] _bytes;
|
|
private int _offset;
|
|
private int _length;
|
|
|
|
public ByteString(byte[] bytes, int offset, int length) {
|
|
_bytes = bytes;
|
|
_offset = offset;
|
|
_length = length;
|
|
}
|
|
|
|
public byte[] Bytes {
|
|
get {
|
|
return _bytes;
|
|
}
|
|
}
|
|
|
|
public bool IsEmpty {
|
|
get {
|
|
return (_bytes == null || _length == 0);
|
|
}
|
|
}
|
|
|
|
public int Length {
|
|
get {
|
|
return _length;
|
|
}
|
|
}
|
|
|
|
public int Offset {
|
|
get {
|
|
return _offset;
|
|
}
|
|
}
|
|
|
|
public byte this[int index] {
|
|
get {
|
|
return _bytes[_offset+index];
|
|
}
|
|
}
|
|
|
|
public String GetString() {
|
|
return GetString(Encoding.UTF8);
|
|
}
|
|
|
|
public String GetString(Encoding enc) {
|
|
if (IsEmpty) {
|
|
return String.Empty;
|
|
}
|
|
return enc.GetString(_bytes, _offset, _length);
|
|
}
|
|
|
|
public byte[] GetBytes() {
|
|
byte[] bytes = new byte[_length];
|
|
if (_length > 0) {
|
|
Buffer.BlockCopy(_bytes, _offset, bytes, 0, _length);
|
|
}
|
|
return bytes;
|
|
}
|
|
|
|
public int IndexOf(char ch) {
|
|
return IndexOf(ch, 0);
|
|
}
|
|
|
|
public int IndexOf(char ch, int offset) {
|
|
for (int i = offset; i < _length; i++) {
|
|
if (this[i] == (byte)ch) {
|
|
return i;
|
|
}
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
public ByteString Substring(int offset) {
|
|
return Substring(offset, _length-offset);
|
|
}
|
|
|
|
public ByteString Substring(int offset, int len) {
|
|
return new ByteString(_bytes, _offset+offset, len);
|
|
}
|
|
|
|
public ByteString[] Split(char sep) {
|
|
ArrayList list = new ArrayList();
|
|
|
|
int pos = 0;
|
|
while (pos < _length) {
|
|
int i = IndexOf(sep, pos);
|
|
if (i < 0) {
|
|
break;
|
|
}
|
|
|
|
list.Add(Substring(pos, i-pos));
|
|
pos = i+1;
|
|
|
|
while (this[pos] == (byte)sep && pos < _length) {
|
|
pos++;
|
|
}
|
|
}
|
|
|
|
if (pos < _length) {
|
|
list.Add(Substring(pos));
|
|
}
|
|
|
|
int n = list.Count;
|
|
ByteString[] result = new ByteString[n];
|
|
|
|
for (int i = 0; i < n; i++) {
|
|
result[i] = (ByteString)list[i];
|
|
}
|
|
|
|
return result;
|
|
}
|
|
}
|
|
}
|