2009-10-17 2 views
0

У меня есть простой массив байтМанипулирование массив байтов

["\x01\x01\x04\x00"] 

Я не знаю, как я могу изменить только второе значение в строке (я знаю, что массив имеет только один пункт), все еще держа объект - массив байтов.

Что-то вдоль этих линий:

["\x01#{ARGV[0]}\x04\x00"] 

ответ

4

Я думаю, секрет в том, что у вас есть вложенный массив:

irb(main):002:0> x = ["\x01\x02\x01\x01"] 
=> ["\001\002\001\001"] 

Вы можете индекс его:

irb(main):003:0> x[0][1] 
=> 2 

Вы можете назначить в него:

irb(main):004:0> x[0][1] = "\x05" 
=> "\005" 

И, похоже, что вы хотите:

irb(main):005:0> x 
=> ["\001\005\001\001"] 
+0

Ничего себе, спасибо Брент, это хорошо работает, спасибо за элегантное решение моей простой маленькой проблемы. –

2

использования метод each_byte строки:

$ irb --simple-prompt 
>> str = "\x01\x01\x04\x00" 
=> "\001\001\004\000" 
>> str.each_byte {|byte| puts byte} 
1 
1 
4 
0 
=> "\001\001\004\000" 
>> 
+0

no wait ... Я не думаю, что я был так же ясен, как я Возможно, я просто хочу заменить второе значение, это все часть байтового массива, поэтому он будет выводиться как байты в любом случае ... возможно, я просто ушел ... у вас может быть прекрасный ответ. +1 –

+1

@jpsilvashy: Было бы хорошо, если бы вы добавили вышеуказанную информацию в вопрос. Оригинальный нечеткий. –

+1

ОК, внес некоторые изменения в мои оригиналы, спасибо @ o.k.w. +1 –

1

Это может быть менее запутанным, чтобы избавиться от обертки массива.

a = ["\x01\x01\x04\x00"] 
a = a[0] 

a[1] = ... 

Вы всегда можете поместить строку обратно в массив:

a = [a] 

Кроме того, технически, это не «байтовый массив», это один-элемент массива, с объектом String. (И в этом отношении, строго говоря, Ruby на самом деле не имеет Array of Type, все массивы Ruby - это что-то вроде Array of Object в другом месте.)

+0

Эй! это действительно отличное решение. Делает строку более управляемой. Спасибо за понимание Массивов в Ruby. +1 –