Я использую пролог SWI. Я хотел бы написать целые числа в двоичный файл в двоичной форме. Пока я не нашел решения и начинаю отчаяться. Может ли кто-нибудь помочь мне с этой проблемой?Prolog конвертировать целое число в байты
ответ
Прошло некоторое время с тех пор, как я использовал 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 пролог позволяет произвольные длины, что, вероятно, является причиной того, что в стандартных библиотеках нет «записывать число как двоичное».
Надеюсь, это поможет, если кто-нибудь знает более хороший способ сделать это, пожалуйста, дайте нам знать!
Большое спасибо! Я надеялся на какую-то скрытую встроенную функцию, но это тоже должно работать :) –
Будет ли это 32-битным целым числом? Какой порядок байтов вы ожидаете? Например, вы выводите 0xFFEEAABB как «0xFF, 0xEE, 0xAA, 0xBB' (сначала самый старший байт) или« 0xBB, 0xAA, 0xEE, 0xFF »(младший старший байт)? – BretC
Да, 32b целых чисел. –