2010-12-06 2 views
1

Как я могу изменить FF02500000000020 на 20000000005002FF в Perl?Как изменить порядок байтов 8-байтовой строки в Perl?

Как я могу сделать, это:

  1. отдельные FF02500000000020 на две части FF025000 и 00000020
  2. добавить 0x перед ними;
  3. затем

    my $num2=0xFF025000; 
    my $num3=0x00000020; 
    my $s2=pack('I!',$num2); 
    my $s3=pack('I!',$num3); 
    print unpack ("H*", "$s2") . "\n"; 
    print unpack ("H*", "$s3") . "\n"; 
    
  4. затем объединить эти две части снова.

Есть ли простой способ?

+1

Какие входные данные вы начинаете с? Строка необработанных байтов? Строка в шестнадцатеричном формате? – aschepler

+0

Это еще одна вещь, которую я смутил. это переменная, которую я получил из другой строки \ xff \ x02 \ x50 \ x00 \ x00 \ x00 \ x00 \ x20, используя @ array = split (/ \\ x /, $ data); и используйте spice и join, чтобы получить эту переменную. и я могу применить функцию hex к этой переменной. Я думаю, это строка. – user389955

ответ

5
print reverse split /(..)/, 'FF02500000000020'; 

Или, если вы хотите его в скалярную:

$val = join '', reverse split /(..)/, 'FF02500000000020'; 
+0

отлично. Большое спасибо – user389955

+0

Привет, в чем разница между этим: – user389955

+0

my $ hex_pers_flags_endian = "FF02500000000020"; my $ hex_pers_flags = reverse split/(..) /, $ hex_pers_flags_endian; print "hex_pers_flags = $ hex_pers_flags \ n"; print reverse split /(..)/, $ hex_pers_flags_endian; – user389955

0

Попробуйте конвертировать :: Binary :: C. Похоже, он может делать то, что вы хотите.

+0

Я не думаю, что это то, чего хотел человек, но приятно знать, что он существует. –

+0

Это, вероятно, лучшее решение для хранения вещей в определенном порядке байтов, предполагая, что именно ОП задает их конкретный вопрос. – OrangeDog

0

Получить данные в (одну) переменную - назовите ее $data. Затем используйте (скаляр) reverse.

print scalar reverse $data; 

Или:

my $reversed = reverse $data; 
+0

не исправляет, он вернется к 02000000000520FF, я хочу 20000000005002FF – user389955

+0

Это зависит от типа данных, который вы хотите обработать. Он отменяет байты; если вы используете строку, содержащую hex, то вы не получите результат. Если у вас есть двоичные данные, это сработает. Если на самом деле у вас есть строка и вы хотите поменять пары байтов, то вы разделите строку на список пар байтов, измените порядок списка и соберите - как в одном из других ответов. Но неточные вопросы порождают неточные ответы. Если бы вы показали пример, «учитывая' my $ data = qq {...}; ', как мне получить результат' my $ res = qq {...}; '? ', Тогда все знали бы что вы хотели. –

+0

ic, поэтому Ответ, который я пишу, вводит в заблуждение. Фактически, ввод представляет собой строку $ hex_pers_flags_endian = "FF02500000000020", а не шестнадцатеричный номер -0xFF025000 ...., поэтому они различаются. Спасибо – user389955

2

Вот один из способов:

$str = unpack 'H*', reverse pack 'H*', $str; 

Заметим, что это будет в нижнем регистре шестигранные символов, так что вы можете добавить uc() в начале, если сохранение случае важно:

$str = uc unpack 'H*', reverse pack 'H*', $str; 
Смежные вопросы