PERL Handling Binary Scalar
1[Question]:
I adopt select()...sysread()...syswrite() mechanism to handle socket messages, where messages are sysread() into $buffer (binary) before they are syswritten.
Now I want to change two bytes of the message, which denote the length of the whole message. At first, I use following code:
my $msglen=substr($buffer,0,2); # Get the first two bytes
my $declen=hex($msglen);
$declen += 3;
substr($buffer,0,2,$declen); # change the length
However, it doesn't work in this way. If the final value of $declen is 85, then the modified $buffer will be "0x35 0x35 0x00 0x02...". I insert digital number to $buffer but finally got ASCII!
I also tried this way:
my $msglen=substr($buffer,0,2); # Get the first two bytes,binary
$msglen += 0b11; # Or $msglen += 3;
my $msgbody=substr($buffer,2); # Get the rest part of message, binary
$buffer=join("", $msglen, $msgbody);
Sadly, this method also failed. The result is such as"0x33 0x 0x00 0x02..." I just wonder why two binary scalar can't be joined into a binary scalar?
Can you help me? Thank you!
[Answer 1]:
my $msglen=substr($buffer,0,2); # Get the first two bytes
my $number = unpack("S",$msglen);
$number += 3;
my $number_bin = pack("S",$number);
substr($buffer,0,2,$number_bin); # change the length
[Answer 2]:
用vec。
比如:
Perl code
my $buffer = "/x00/x01";
print unpack("H*", $buffer), "/n";
vec($buffer, 0, 16) += 3;
print unpack("H*", $buffer), "/n";
2[Question]:
I am writing a Perl program that sends and receives messages from two sockets and acta as a switch. I have to modify the received messages received from one socket, prepend 3 bytes to the data, and finally send the modified messages to another socket. I adopt select()...sysread()...syswrite() mechanism to poll for messages between sockets. The received messages are stored in $buffer during modification.
Now I can use following way to get the received messages:
my $hexmsg = unpack("H*", $buffer);
my @msg = ( $hexmsg =~ m/../g );
then I can insert 3 bytes to @msg. However, I don't know how to pack the message in @msg into a scalar(such as $buffer) and send it to another socket by syswrite(). Can anybody help me? Thank you in advance!
BTW, are messages in $buffer binary?
[Answer]:
Yes, messages in $buffer are binary (if I'm guessing what you mean by that correctly). If your only reason for unpacking it into @msg is to insert the bytes, don't. Usesubstrinstead, and just write out the changed $buffer. For instance:
substr( $buffer, 0, 0, "/x01/x02/x03" ); # insert 3 bytes at beginning.
If you are doing other things with @msg, you could continue to use that as well as doing the substr insert before writing it out, or you could use substr or pack or split or vec or a regex to parse out the pieces you need. You'd need to describe what you are doing to get more specific help.
分享到:
相关推荐
以二进制方式读写文件句柄 有问题的文件句柄 关闭文件句柄 用die处理致命错误 用warn输出警告信息 自动检测致命错误 使用文件句柄 改变默认的文件输出句柄 重新打开标准文件句柄 用say来输出 …… 第六章...
12. **文本模式和二进制模式**:Perl中的open()函数可以打开文本模式或二进制模式的文件,以正确处理不同平台的换行符和其他二进制数据。 通过《Perl高级编程》这本书,读者将能够深入理解这些概念,并掌握在实际...
第二章节介绍了perl语言中的标量数据类型,包括数字和字符串的概念及其操作。在这个部分,读者将学习到数字的内部格式、浮点数和整数的区别、非十进制整数的使用以及数字操作符。对于字符串,本章节会讨论单引号和双...
Perl支持多种进制的整数直接量,包括二进制(前缀0b)、八进制(前缀0)和十六进制(前缀0x),并且可以使用下划线提高可读性。 在运算操作符方面,Perl提供了加法(+)、减法(-)、乘法(*)、除法(/)、求余数...
4. **安装**:编译无误后,使用`make install`命令将编译好的Perl二进制文件和库安装到系统中。默认情况下,Perl会安装到 `/usr/local` 目录下。 Perl的语法特性包括但不限于: - **变量**:Perl支持多种类型的...
14. **位操作**:Perl也支持位级别的操作,如`&`、`|`、`^`等,用于处理二进制数据。 这些例子可能会涵盖上述所有知识点,通过实际的代码示例帮助学习者深入理解Perl的语法和功能。每一个例子都可能包含特定场景的...
- **非十进制整数**: Perl支持不同进制的整数直接量,例如二进制形式0b11101110、八进制形式0377以及十六进制形式0xf。 通过这篇笔记,我们可以了解到Perl语言的基本概念和发展历程,以及如何编写简单的Perl脚本。...
1. **Perl安装与配置**:讲解如何在不同操作系统上安装Perl,包括获取源代码编译和使用预编译的二进制包。还会介绍如何配置Perl环境,以适应特定的开发需求。 2. **Perl语法与数据结构**:Perl的语法简洁而灵活,书...
2. **文件I/O**:Perl提供了简洁的接口进行文件读写操作,支持各种文件模式,如追加、读写等,而且可以方便地处理文本文件和二进制文件。 3. **模块系统**:Perl的CPAN(Comprehensive Perl Archive Network)包含...
Perl还支持处理文本文件和二进制文件,以及常见的文件系统操作,如目录遍历和文件权限设置。 控制流程是所有编程语言的基础,Perl也不例外。读者将学习到条件语句(if-else)、循环结构(while、for、foreach)、子...
11. **位操作**:Perl也提供了对二进制数据的处理能力,包括位移、按位与、或、异或等操作。 通过这个Perl教程,初学者将逐步了解并掌握上述知识点,从而能够编写出解决实际问题的Perl脚本。在学习过程中,建议结合...
9. **文本模式和二进制模式**:Perl的文件操作既可以处理文本文件,也可以处理二进制文件,通过`binmode`函数可以切换模式。 10. **散列表和关联数组**:Perl的散列数据结构提供快速的键值对查找,常用于存储和检索...
理解IO重定向和管道,熟悉二进制和文本模式的区别。 3. **模块和CPAN**:Perl拥有丰富的模块生态,通过 Comprehensive Perl Archive Network (CPAN) 可以获取到数以万计的预编译模块。学习如何使用CPAN,安装和使用...
文件操作在Perl中非常简单,可以轻松读写文本文件或二进制文件。open函数打开文件,readline、print、seek等函数进行读写操作,最后使用close关闭文件。 Perl的错误处理机制也很灵活,可以使用eval块捕获异常,或者...
3. Perl不适用于产生二进制码,主要因为它的解释执行和运行时编译的特性。 4. 由于Perl具有丰富的内置功能,常被用于黑客攻击,尤其在进行缓冲区溢出攻击和脚本攻击时。 在Perl的编程实践当中,开发者可以利用CPAN...
为了开始使用 Perl,首先需要获取其二进制文件及文档。可以在 Perl 官方网站或其他可信资源处下载 Perl。安装完成后,可以通过 Perl 的文档命令(例如 `perldoc`)来访问官方文档。 #### 基础知识 Perl 支持多种...
- **位运算符**:用于处理二进制位的操作,如按位与(`&`)、按位或(`|`)。 - **比较运算符**:用于比较两个值,如`==`(等于)、`!=`(不等于)。 - **字符串运算符**:包括连接运算符(`.`)和重复运算符(`x`)。 - **...
#### 二、Perl基础语法与数据类型 **知识点3:标量数据类型** Perl中的标量数据类型主要包括数字和字符串。数字可以是浮点数或整数,支持十进制、八进制、十六进制等多种表示形式。字符串则可以由单引号或双引号...
探索面向记录的处理方式,以及如何处理二进制数据。 第十三至十八课:模块和CPAN Perl拥有大量的第三方模块,它们通过CPAN(Comprehensive Perl Archive Network)分发。学习如何使用cpan或cpanm安装模块,并理解...
Perl 常用命令_函数集 Perl 是一种功能强大且灵活的编程语言,提供了许多...这些函数涵盖了进程处理、数学运算、字符串处理、标量转换、数组和列表处理、关联数组处理等多个方面,为开发者提供了强大的功能和灵活性。