2015-04-20 2 views
0

Я использую пролог SWI. Я хотел бы написать целые числа в двоичный файл в двоичной форме. Пока я не нашел решения и начинаю отчаяться. Может ли кто-нибудь помочь мне с этой проблемой?Prolog конвертировать целое число в байты

+0

Будет ли это 32-битным целым числом? Какой порядок байтов вы ожидаете? Например, вы выводите 0xFFEEAABB как «0xFF, 0xEE, 0xAA, 0xBB' (сначала самый старший байт) или« 0xBB, 0xAA, 0xEE, 0xFF »(младший старший байт)? – BretC

+0

Да, 32b целых чисел. –

ответ

1

Прошло некоторое время с тех пор, как я использовал SWI Prolog.

Я не мог видеть ничего, что могло бы написать число в двоичной форме во встроенных библиотеках, но вы могли бы попробовать и написать свой собственный.

Следующие функции работают только с номерами от 0 до 4294967295 включительно (32-битный int без знака) и выведут номер в 4 байта, младший старший байт.

Если запустить «тест», это создаст файл 4 байт, называемый «byte.dat», напишите номер, а затем прочитать его снова и распечатать его ...

doWrite(FileName, Number) :- 
    open(FileName, write, O, [all(true), encoding(octet)]), 
    writeInt32(O, Number), 
    close(O). 

doRead(FileName, Number) :- 
    open(FileName, read, I, [all(true), encoding(octet)]), 
    readInt32(I, Number), 
    close(I). 

writeInt32(OS, Number) :- 
    B0 is Number /\ 255, 
    B1 is (Number >> 8) /\ 255, 
    B2 is (Number >> 16) /\ 255, 
    B3 is (Number >> 24) /\ 255, 
    put_byte(OS, B0), 
    put_byte(OS, B1), 
    put_byte(OS, B2), 
    put_byte(OS, B3). 

readInt32(IS, Number) :- 
    get_byte(IS, B0), 
    get_byte(IS, B1), 
    get_byte(IS, B2), 
    get_byte(IS, B3), 
    Number is B0 + B1<<8 + B2<<16 + B3<<24. 

test :- 
    doWrite('byte.dat', 3287465), 
    doRead('byte.dat', X), 
    write(X). 

SWI пролог позволяет произвольные длины, что, вероятно, является причиной того, что в стандартных библиотеках нет «записывать число как двоичное».

Надеюсь, это поможет, если кто-нибудь знает более хороший способ сделать это, пожалуйста, дайте нам знать!

+0

Большое спасибо! Я надеялся на какую-то скрытую встроенную функцию, но это тоже должно работать :) –