nelexa / buffer
读取和写入二进制数据(包括原始类型,例如 byte, ubyte, short, ushort, int, uint, long, float, double)。这些类还有助于将JAVA代码的I/O操作移植。
Requires
- php: >=5.4
Requires (Dev)
- phpunit/phpunit: ^4.8
This package is auto-updated.
Last update: 2024-08-26 05:51:22 UTC
README
这些类定义了读取和写入所有原始类型值的方法。原始值根据缓冲区的当前字节序转换为(或从)字节数据序列,字节序可以通过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_ENDIAN
或 Buffer::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');
插入原始类型
插入布尔值 false
或 true
。通过 +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');
放置基本类型
放置布尔值 false
或 true
。移动位置增加 +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');
用基本类型替换
用布尔值 false
或 true
替换。大小减少 (-$长度 + 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'));