nelexa/buffer

读取和写入二进制数据(包括原始类型,例如 byte, ubyte, short, ushort, int, uint, long, float, double)。这些类还有助于将JAVA代码的I/O操作移植。

1.3.0 2019-05-25 17:47 UTC

This package is auto-updated.

Last update: 2024-08-26 05:51:22 UTC


README

Packagist Version Packagist Build Status License

这些类定义了读取和写入所有原始类型值的方法。原始值根据缓冲区的当前字节序转换为(或从)字节数据序列,字节序可以通过order方法检索和修改。字节数组的初始顺序始终为Buffer::BIG_ENDIAN。

要求

  • PHP >= 5.4 (64位)

安装

composer require nelexa/buffer

文档

\Nelexa\Buffer 类是抽象的,为所有其他缓冲区提供基础方法。

将缓冲区初始化为字符串。

$buffer = new \Nelexa\StringBuffer();
// or
$buffer = new \Nelexa\StringBuffer($text);

将缓冲区初始化为文件。

$buffer = new \Nelexa\FileBuffer($filename);

将缓冲区初始化为内存资源(php://memory)。

$buffer = new \Nelexa\MemoryReourceBuffer();
// or
$buffer = new \Nelexa\MemoryReourceBuffer($text);

将缓冲区初始化为流资源。

$fp = fopen('php://temp', 'w+b');
// or
$buffer = new \Nelexa\ResourceBuffer($fp);

设置只读缓冲区

$buffer->setReadOnly(true);

检查在缓冲区中记录的可能性

$boolValue = $buffer->isReadOnly();

修改此缓冲区的字节序,可以是 Buffer::BIG_ENDIANBuffer::LITTLE_ENDIAN

$buffer->setOrder(\Nelexa\Buffer::LITTLE_ENDIAN);

获取缓冲区的字节序

$byteOrder = $buffer->order();

获取缓冲区大小。

$size = $buffer->size();

设置缓冲区位置。

$buffer->setPosition($position);

获取缓冲区位置。

$position = $buffer->position();

跳过字节。

$buffer->skip($count);

// example
$buffer->insertString('Test value');
assert($buffer->position() === 10);
$buffer->skip(-7);
assert($buffer->position() === 3);
$buffer->skip(2);
assert($buffer->position() === 5);

跳过原始类型大小。

$buffer->skipByte(); // skip 1 byte
$buffer->skipShort(); // skip 2 bytes
$buffer->skipInt(); // skip 4 bytes
$buffer->skipLong(); // skip 8 bytes
$buffer->skipFloat(); // skip 4 bytes
$buffer->skipDouble(); // skip 8 bytes

重置此缓冲区。位置设置为0。

$buffer->rewind();

// example
$buffer->insertString('Test value');
assert($buffer->position() === 10);
$buffer->rewind();
assert($buffer->position() === 0);
assert($buffer->size() === 10);

翻转此缓冲区。限制设置为当前位置,然后位置设置为0。

$buffer->flip();

// example
$buffer->insertString('Test value');
assert($buffer->position() === 10);
$buffer->setPosition(5);
$buffer->flip();
assert($buffer->position() === 0);
assert($buffer->size() === 5);

返回当前位置和限制之间的元素数量。

$remaining = $buffer->remaining();

// example
$buffer->insertString('Test value');
assert($buffer->position() === 10);
$buffer->setPosition(7);
assert($buffer->remaining() === 10 - 7);

告诉当前位置和限制之间是否有任何元素。如果,并且仅在缓冲区中至少还有一个元素剩余时,返回True

$boolValue = $buffer->hasRemaining();

// example
$buffer->insertString('Test value');
assert($buffer->position() === 10);
assert($buffer->hasRemaining() === false);
$buffer->setPosition(9);
assert($buffer->hasRemaining() === true);

关闭缓冲区并释放资源

$buffer->close();

读取缓冲区

将缓冲区的全部内容读取到字符串中,而不更改缓冲区的位置。

$allBufferContent = $buffer->toString();

// example
$buffer->insertString('Test value');
assert($buffer->position() === 10);
$buffer->setPosition(4);
$allBufferContent = $buffer->toString();
assert($buffer->position() === 4);
assert($allBufferContent === 'Test value');

读取此缓冲区的当前位置的字符串,然后递增位置。

$content = $buffer->get($length);

// example
$buffer->insertString('Test value');
assert($buffer->position() === 10);
$buffer->setPosition(3);
$content = $buffer->get(5);
assert($buffer->position() === 8);
assert($content === 't val');
读取文字类型

写入缓冲区

向缓冲区插入字节

向缓冲区插入字符串(byte[])或Buffer。

$buffer->insert('content');
// or
$buffer->insert(new StringBuffer('Other buffer'));

// example
assert($buffer->position() === 0);
assert($buffer->size() === 0);
$buffer->insert('Test value');
assert($buffer->position() === 10);
assert($buffer->size() === 10);
$buffer->setPosition(4);
$buffer->insert('ed');
assert($buffer->position() === 6);
assert($buffer->size() === 12);
assert($buffer->toString() === 'Tested value');
插入原始类型

插入布尔值 falsetrue。通过 +1 改变大小和位置。

$buffer->insertBoolean($boolValue);

插入字节 (-128 >= byte <= 127)。通过 +1 改变大小和位置。

$buffer->insertByte($byteValue);

插入 short 值 (-32768 >= short <= 32767)。通过 +2 改变大小和位置。

$buffer->insertShort($shortValue);

插入 int 值 (-2147483648 >= int <= 2147483647)。通过 +4 改变大小和位置。

$buffer->insertInt($intValue);

插入 long 值 (-9223372036854775808 >= long <= 9223372036854775807)。通过 +8 改变位置。

$buffer->insertLong($longValue);

插入 float 值(单精度32位IEEE 754浮点数)。通过 +4 改变位置。

$buffer->insertFloat($floatValue);

插入 double 值(双精度64位IEEE 754浮点数)。通过 +8 改变位置。

$buffer->insertDouble($doubleValue);

插入字节数组。通过 +(数组大小) 改变大小和位置。

$buffer->insertArrayBytes($bytes);

插入字符串值。通过 +(字符串长度) 改变大小和位置。

$buffer->insertString($string);

插入以UTF-8编码的字符串,前两个字节作为长度字符串。通过 +(2 + 字符串长度) 改变大小和位置。

类似于java java.io.DataOutputStream#writeUTF(String str)

$buffer->insertUTF($string);

以UTF-16编码插入字符串。通过 +(字符串长度 * 2) 改变大小和位置。

$buffer->insertUTF16($string);

将字节放入缓冲区

将字符串(byte[])或Buffer放入缓冲区并覆盖旧值。

$buffer->put('content');
// or
$buffer->put(new StringBuffer('Other buffer'));

// example
assert($buffer->position() === 0);
assert($buffer->size() === 0);
$buffer->insert('Test value');
assert($buffer->position() === 10);
assert($buffer->size() === 10);
$buffer->setPosition(4);
$buffer->put('ed');
assert($buffer->position() === 6);
assert($buffer->size() === 10);
assert($buffer->toString() === 'Testedalue');
放置基本类型

放置布尔值 falsetrue。移动位置增加 +1。

$buffer->putBoolean($boolValue);

放置字节类型 (-128 >= byte <= 127)。移动位置增加 +1。

$buffer->putByte($byteValue);

放置短整型 (-32768 >= short <= 32767)。移动位置增加 +2。

$buffer->putShort($shortValue);

放置整型 (-2147483648 >= int <= 2147483647)。移动位置增加 +4。

$buffer->putInt($intValue);

放置长整型 (-9223372036854775808 >= long <= 9223372036854775807)。移动位置增加 +8。

$buffer->putLong($longValue);

放置浮点型值(单精度 32 位 IEEE 754 浮点数)。移动位置增加 +4。

$buffer->putFloat($floatValue);

放置双精度值(双精度 64 位 IEEE 754 浮点数)。移动位置增加 +8。

$buffer->putDouble($doubleValue);

放置数组字节。移动位置增加 +(数组大小)。

$buffer->putArrayBytes($bytes);

插入字符串值。移动位置增加 +(字符串长度)。

$buffer->putString($string);

放置使用编码前两个字节作为长度字符串的 UTF-8 字符串。移动位置增加 +(2 + 字符串长度)。

类似于java java.io.DataOutputStream#writeUTF(String str)

$buffer->puttUTF($string);

放置使用 UTF-16 编码的字符串。移动位置增加 +(字符串长度 * 2)。

$buffer->putUTF16($string);

用缓冲区替换字节

用字符串或另一个缓冲区替换以下一定数量的字节

$buffer->replace('content', $length);
// or
$buffer->insert(new StringBuffer('Other buffer'), $length);

// example
assert($buffer->position() === 0);
assert($buffer->size() === 0);
$buffer->insert('Test value');
assert($buffer->position() === 10);
assert($buffer->size() === 10);
$buffer->setPosition(4);
$buffer->replace('ed', 4); // remove 4 next bytes and insert 2 bytes
assert($buffer->position() === 6);
assert($buffer->size() === 8);
assert($buffer->toString() === 'Testedlue');
用基本类型替换

用布尔值 falsetrue 替换。大小减少 (-$长度 + 1) 和位置增加 +1。

$buffer->replaceBoolean($boolValue, $length);

用字节 (-128 >= byte <= 127) 替换。大小减少 (-$长度 + 1) 和位置增加 +1。

$buffer->replaceByte($byteValue, $length);

用短整型 (-32768 >= short <= 32767) 替换。大小减少 (-$长度 + 2) 和位置增加 +2。

$buffer->replaceShort($shortValue, $length);

用整型 (-2147483648 >= int <= 2147483647) 替换。大小减少 (-$长度 + 4) 和位置增加 +4。

$buffer->replaceInt($intValue, $length);

用长整型 (-9223372036854775808 >= long <= 9223372036854775807) 替换。大小减少 (-$长度 + 8) 和位置增加 +8。

$buffer->replaceLong($longValue, $length);

用浮点型值(单精度 32 位 IEEE 754 浮点数)替换。大小减少 (-$长度 + 4) 和位置增加 +4。

$buffer->replaceFloat($floatValue, $length);

用双精度值(双精度 64 位 IEEE 754 浮点数)替换。大小减少 (-$长度 + 8) 和位置增加 +8。

$buffer->replaceDouble($doubleValue, $length);

用数组字节替换。大小减少 (-$长度 + 数组大小) 和位置增加 +(数组大小)。

$buffer->replaceArrayBytes($bytes, $length);

用字符串值替换。大小减少 (-$长度 + 字符串长度) 和位置增加 +(字符串长度)。

$buffer->replaceString($string, $length);

用使用编码前两个字节作为长度字符串的 UTF-8 字符串替换。大小减少 (-$长度 + 2 + 字符串长度) 和位置增加 +(2 + 字符串长度)。

类似于java java.io.DataOutputStream#writeUTF(String str)

$buffer->replaceUTF($string, $length);

用使用 UTF-16 编码的字符串替换。大小减少 (-$长度 + 字符串长度 * 2) 和位置增加 +(2 * 字符串长度)。

$buffer->replaceUTF16($string, $length);

用缓冲区移除字节

移除一定数量的字节。大小减少 -$长度。

$buffer->remove($length);

// example
assert($buffer->position() === 0);
assert($buffer->size() === 0);
$buffer->insert('Test value');
assert($buffer->position() === 10);
assert($buffer->size() === 10);
$buffer->setPosition(4);
$buffer->remove(3); // remove 3 next bytes
assert($buffer->position() === 4);
assert($buffer->size() === 7);
assert($buffer->toString() === 'Testlue');

移除所有字节。截断缓冲区。

$buffer->truncate($size = 0);

// example
assert($buffer->position() === 0);
assert($buffer->size() === 0);
$buffer->insert('Test value');
assert($buffer->position() === 10);
assert($buffer->size() === 10);
$buffer->truncate(0);
assert($buffer->position() === 0);
assert($buffer->size() === 0);

流式接口

// example
($buffer = new StringBuffer())
       ->insertByte(1)
       ->insertBoolean(true)
       ->insertShort(5551)
       ->skip(-2)
       ->insertUTF("Hello, World")
       ->truncate()
       ->insertString(str_rot13('Hello World'))
       ->setPosition(7)
       ->flip();
        
assert($this->buffer->size() === 7);
assert($this->buffer->position() === 0);
assert($this->buffer->toString() === str_rot13('Hello W'));