Строки в PHP всегда являются BLOB-объектами.Таким образом, вы можете использовать строку для хранения значения для вашей базы данных BLOB.Все это базовое преобразование и т. Д. Связано с представлением этого BLOB.
Если вы хотите хорошее представление вашего BLOB, понятное человеку, то имеет смысл показать байтыон содержит, и, вероятно, использовать шестнадцатеричный, а не десятичный.Следовательно, строка "41 42 43" - это хороший способ представить байтовый массив, который в C # будет
var bytes = new byte[] { 0x41, 0x42, 0x43 };
, но, очевидно, не aхороший способ представлять эти байты!Строка «ABC» является эффективным представлением, потому что на самом деле это тот же самый BLOB-объект (только в этом случае он не такой большой).
На практике вы обычно получаете свои большие двоичные объекты от функций, которые возвращают строку, таких как эта функция хеширования, или других встроенных функций, таких как fread .
В редких случаях.случаи (но не настолько редкие, когда просто что-то пробуете / прототипируете), когда вам нужно просто создать строку из некоторых жестко закодированных байтов, и я не знаю ничего более эффективного, чем преобразование «шестнадцатеричной строки» в то, что часто называют«бинарная строка» в PHP:
$myBytes = "414243";
$data = pack('H*', $myBytes);
Если вы var_dump($data);
, он покажет вам string(3) "ABC"
.Это потому, что 0x41 = 65 decimal = 'A' (в основном во всех кодировках).
Поскольку просмотр двоичных данных путем интерпретации их как строки не совсем интуитивно понятен, вы можете захотеть сделать базовую оболочку, чтобы упростить отладку.Один из возможных таких оберток - это
class blob
{
function __construct($hexStr = '')
{
$this->appendHex($hexStr);
}
public $value;
public function appendHex($hexStr)
{
$this->value .= pack('H*', $hexStr);
}
public function getByte($index)
{
return unpack('C', $this->value{$index})[1];
}
public function setByte($index, $value)
{
$this->value{$index} = pack('C', $value);
}
public function toArray()
{
return unpack('C*', $this->value);
}
}
Это то, что я приготовил на лету, и, вероятно, просто отправная точка для вашей собственной обертки.Но идея состоит в том, чтобы использовать строку для хранения, поскольку это наиболее эффективная структура, доступная в PHP, и в то же время предоставляемые методы, такие как toArray (), для использования в наблюдениях / оценках отладчика, когда вы хотите изучить содержимое.
Конечно, вместо этого вы можете использовать совершенно простой массив PHP и упаковать его в строку при взаимодействии с чем-то, что использует строки для двоичных данных.В зависимости от того, в какой степени вы на самом деле собираетесь модифицировать большой двоичный объект, это может оказаться проще, и, хотя он не занимает мало места, я думаю, вы получите приемлемую производительность для многих задач.
Пример, иллюстрирующийфункциональность:
// Construct a blob with 3 bytes: 0x41 0x42 0x43.
$b = new blob("414243");
// Append 3 more bytes: 0x44 0x45 0x46.
$b->appendHex("444546");
// Change the second byte to 0x41 (so we now have 0x41 0x41 0x43 0x44 0x45 0x46).
$b->setByte(1, 0x41); // or, equivalently, setByte(1, 65)
// Dump the first byte.
var_dump($b->getByte(0));
// Verify the result. The string "AACDEF", because it's only ASCII characters, will have the same binary representation in basically any encoding.
$ok = $b->value == "AACDEF";