преобразование строк в 32-битные двоичные слова с использованием perl - PullRequest
0 голосов
/ 29 октября 2018

У меня есть файл сборки, сгенерированный из компилятора. Он объявляет все строки следующим образом:

LC0:
   .string "Testing...\r\n"

LC1:
   .string "HelloWorld...\r\n"

Я хочу заменить эти строки переменной длины соответствующими значениями ascii, но в 32-разрядных словах шириной, таких как первая строка, следует заменить 3 последовательными 32-разрядными словами, т.е. 0x54657374, 0x696e672e и 0x2e2e0d0a. И затем преобразуется в десятичном виде:

LC0:
    .data.32 1415934836
    .data.32 1768843054
    .data.32 774769930

и аналогично от LC1 до 0x48656c6c, 0x6f576f72, 0x6c642e2e & 0x2e0d0a00 как:

LC1:
    .data.32 1214606444
    .data.32 1868001138
    .data.32 1818504750
    .data.32 772606464

Кто-нибудь может мне помочь в этом. Привет

1 Ответ

0 голосов
/ 29 октября 2018

pack / unpack являются лучшими для этого типа преобразований. Используйте String :: Interpolate для безопасной интерполяции символов с обратной косой чертой (возможно, он не поддерживает тот же синтаксис, что и ваш компилятор, поэтому проверяйте должным образом).

#!/usr/bin/perl
use warnings;
use strict;

use String::Interpolate;

my $interpolate = 'String::Interpolate'->new;

while (<>) {
    if (my ($string) = /^\s+\.string\s+"(.*)"/) {
        $string = $interpolate->($string);
        print map "    .data.32 $_\n", unpack 'N*', "$string\0\0\0";
    } else {
        print;
    }
}

Выход:

LC0:
    .data.32 1415934836
    .data.32 1768843054
    .data.32 774769930

LC1:
    .data.32 1214606444
    .data.32 1868001138
    .data.32 1818504750
    .data.32 772606464
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...