Может ли MySQL вывести эквивалент целого числа, упакованного в perl? - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь извлечь данные из столбца таблицы MySQL непосредственно в двоичный файл, представляющий собой последовательность упакованных целых чисел без знака (по 4 байта в каждом), которые можно прочитать с помощью функции perl unpack.Глупый пример того, как я мог бы прочитать эти данные:

#!/usr/bin/env perl
my $input_file = 'packed_int_test_file_04';
open my $fh, '<:raw', $input_file
  or die "Couldn't open $input_file for binary read: $!";

my $position = 0;
my $four_byte_buffer;
while ( read($fh, $four_byte_buffer, 4) ) {
    my $foo_val  = unpack("I", $four_byte_buffer);
    print("Foo val at position $position is $foo_val \n");
    $position++;
}

# OUTPUT:
# Foo val at position 0 is 1 
# Foo val at position 1 is 2 
# Foo val at position 2 is 3 
# Foo val at position 3 is 4 
# Foo val at position 4 is 5 
# Foo val at position 5 is 6 

Я надеюсь, что смогу сгенерировать файл данных напрямую из MySQL с помощью чего-то вроде следующего (но мне не повезло)

select (cast foo_val_integer as binary(4)) 
from bar_table
into outfile 'packed_int_test_file_04'
FIELDS terminated by ''
LINES terminated by '';

Есть ли способ заставить MySQL напрямую выводить последовательность 4-байтовых упакованных целых чисел без знака в двоичный файл, который может быть прочитан perl таким образом?

1 Ответ

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

Формат, ожидаемый unpack 'I', варьируется от сборки к сборке.Я полагаю, что вы пытаетесь получить один из следующих форматов:

  • 32-разрядное целое число без знака (например, 0x12345678, упакованное как 12 34 56 78)

    Распаковывается переносимым способом с использованием

    unpack 'L>'
    

    Упаковывается с использованием

    CHAR(
        ( i >> 24 ) & 0xFF,
        ( i >> 16 ) & 0xFF,
        ( i >>  8 ) & 0xFF,
        ( i >>  0 ) & 0xFF
    ) 
    
  • 32-разрядное целое число без знака с прямым порядком байтов (например, 0x12345678 упаковывается как 78 56 34 12)

    Распаковывается переносным способом с использованием

    unpack 'L<'
    

    Упаковывается с использованием

    CHAR(
        ( i >>  0 ) & 0xFF,
        ( i >>  8 ) & 0xFF,
        ( i >> 16 ) & 0xFF,
        ( i >> 24 ) & 0xFF
    ) 
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...