Вы можете сделать это, используя операции сдвига влево и вправо. Они преобразуют байты в целые числа, поэтому их необходимо преобразовать обратно в байт.
Ниже приведен основной пример. Я использую индексы, начинающиеся с 0, поэтому для проверки вашего примера вы должны вызвать rangeOf (sourceByteArray, 4, 11) Эта функция только демонстрирует метод; проверка должна быть сделана на диапазонах, и это может быть сделано быстрее.
public byte[] rangeOf(byte[] source, int start, int end){
int firstSourceByte = start/8;
int shift = start%8;
int size = (end - start)/8;
if ((end - start)%8>0) size++;
byte[] returnArray = new byte[size];
for(int i = 0; i < size; i++) {
returnArray[i] = (byte) (source[firstSourceByte + i] << shift);
returnArray[i] += (byte) (source[firstSourceByte + i +1] >> (8 - shift));
}
return returnArray;
}
Вы можете кодировать пользовательский метод записи:
STATUS_VALUES = { 1 => 'new', 2 => 'modified', 3 => 'deleted' }
class Foo
attr_reader :status_id
def status
STATUS_VALUES[@status_id]
end
def status=(new_value)
@status_id = STATUS_VALUES.invert[new_value]
new_value
end
end
Например, следующая программа:
foo_1 = Foo.new
foo_1.status = 'new'
puts "status: #{foo_1.status}"
puts "status_id: #{foo_1.status_id}"
foo_1.status = 'deleted'
puts "status: #{foo_1.status}"
puts "status_id: #{foo_1.status_id}"
выводит:
status: new
status_id: 1
status: deleted
status_id: 3
Одним из способов может быть использование констант
module MyConstants
New = 1
Used = 2
end
. Затем вы можете использовать их примерно так
Foo.status = MyConstants::New
или даже так, если вам небезразлично загрязнение пространства имен
include MyConstants
Foo.status = New
С другой стороны, возможно, вы захотите использовать конечный автомат .
I'd just go ahead and use symbols, something like
Foo.status = :new
They're basically immutable strings, meaning that no matter how many times you use the same symbol in your code, it's still one object in memory:
>> :new.object_id
=> 33538
>> :new.object_id
=> 33538
>> "new".object_id
=> 9035250
>> "new".object_id
=> 9029510 # <- Different object_id