В Smalltalk (или, по крайней мере, Squeak и Pharo) существует переносимый способ получить байты, которые составляют целое число, начиная с самого значимого байта, за которым следуют самые последние и т. Д., Независимо от порядка байтов различия между платформами?Как получить байты, которые составляют целое число?
ответ
1 to: (31 highBitOfMagnitude) do: [:i | Transcript show: (31 bitAt: i)].
Или что-то вдоль этой линии.
Извините, я прочитал биты, а не байты. Поэтому вам нужно связать бит в байтах. Предполагая, что вы имеете в виду байт = 8 бит, это должно быть «выполнимо»
Вы знаете, что может быть много байтов? Целые могут быть произвольного размера, с SmallIntegers в качестве прямых объектов 31 бит (в 32-битное изображение)
Try digitAt: и digitAt: положить ::
(333 digitAt: 1) hex '4D'
Роберт прав: digitAt: idx извлекает байт, начиная с индекса 1 (как обычно) для младшего байта. digitLength дает вам количество цифр.
Так перечислить использование:
n digitLength downTo:1 do:[:idx | do something with (n digitAt:idx)]
Я не уверен, если есть соглашение о том, что возвращается при больших отрицательных чисел, так Smalltalks, как правило, используют представление знак-значение для LargeInts но 2 в дополнение к SmallInts. Поэтому вам, возможно, придется это проверить.
Предостережение: мне, digitAt: немного плохое имя - я склонен ассоциировать его с «десятичной цифрой-на», что вводит в заблуждение.
Это зависит от того, как выглядит ваш номер. Если вы просто хотели бы получить цифры номера, вы могли бы сделать что-то вроде
12345 printString do: [ :c | "Your code to manipulate the digits here" ]
Делитесь и наслаждайтесь.
Поскольку вы запрашиваете целое число, нет разницы в платформах, MSB и LSB всегда одинаковы – mathk