Cor*_*all 3 encryption perl byte
文档都指导我支持unicode,但我不认为我的请求与Unicode有任何关系.我想在单个标量的上下文中处理原始字节; 我需要能够找出它的长度(以字节为单位),获取它的子串(以字节为单位),将字节写入光盘,以及通过网络.有没有一种简单的方法可以做到这一点,而不将字节视为perl中的任何编码?
编辑
更明确地说,
my $data = "Perl String, unsure of encoding and don't need to know";
my @data_chunked_into_1024_bytes_each = #???
Run Code Online (Sandbox Code Playgroud)
Perl的字符串是,在概念上,串字符,它们是正32位整数该(通常)表示Unicode代码点.Perl中的字节字符串只是一个字符串,其中所有字符的值都小于256.
(这是概念视图.内部表示有点复杂,因为perl解释器试图将字节字符串 - 在上述意义上 - 存储为实际字节字符串,而对包含字符值256的字符串使用通用UTF-8编码但是对于用户而言,这一切都应该是透明的,实际上大部分都是,除了像bitwise not(~)运算符这样的丑陋的历史角落情况.)
至于如何将一般字符串转换为字节字符串,这实际上取决于您包含的字符串以及字节字符串应包含的内容:
如果你的字符串已经是一串字节 - 例如,如果你从二进制模式的文件中读取它 - 那么你不需要做任何事情.该字符串不应包含任何高于255的字符,如果有,则该错误,并且可能由加密代码报告.
同样,如果您的字符串应该用ASCII或ISO-8859-1编码(分别编码Unicode的7位和8位子集)编码文本,那么您不需要做任何事情:任何字符直到255已经被正确编码,并且任何更高的值对于那些编码都是无效的.
如果输入字符串包含要以其他编码进行编码的(Unicode)文本,则需要将字符串转换为该编码.通常的方法是使用Encode模块,如下所示:
use Encode;
my $byte_string = encode( "name of encoding", $text_string );
Run Code Online (Sandbox Code Playgroud)
显然,您可以将字节字符串转换回相应的字符串:
use Encode;
my $text_string = decode( "name of encoding", $byte_string );
Run Code Online (Sandbox Code Playgroud)对于UTF-8编码的特殊情况,也可以使用内置utf8::encode()函数代替Encode::encode():
utf8::encode( $string );
Run Code Online (Sandbox Code Playgroud)
这基本上与以下内容相同:
use Encode;
$string = encode( "utf8", $string );
Run Code Online (Sandbox Code Playgroud)
请注意,与函数不同Encode::encode(),该utf8::encode()函数直接修改输入字符串.另请注意,"utf8"上面提到了Perl的扩展UTF-8编码,它允许超出官方Unicode范围的值; 对于严格符合标准的UTF-8编码,请使用"utf-8"连字符(有关详细信息,请参阅编码文档).而且,是的,还有一个utf8::decode()功能几乎可以满足您的期望.