如何在Perl中将带\x的Postgres bytea十六进制字符串转ASCII?
解决\x开头的Postgres bytea数据解码问题
你的问题核心在于Perl编译时会自动解析\x开头的两位十六进制转义字符,导致变量实际存储的内容是F726f6d3a20224d(\x46被转成F,剩余部分保留原始十六进制字符),而非完整的十六进制串。针对这种已被预解析的字符串,可以通过以下方式还原:
具体实现代码
my $value = "\x46726f6d3a20224d"; # 实际存储为"F726f6d3a20224d" # 方法一:分步处理 my $first_hex = unpack('H2', substr($value, 0, 1)); my $full_hex = $first_hex . substr($value, 1); my $result = pack('H*', $full_hex); print $result; # 输出:From: "M" # 方法二:正则一行处理 $value =~ s/^(.)(.*)/pack('H*', unpack('H2', $1) . $2)/e; print $value; # 输出:From: "M"
原理说明
unpack('H2', $char):将单个字符转换为对应的两位十六进制字符串(比如F转为46)- 拼接首字符的十六进制值与剩余的十六进制字符,得到完整的原始十六进制串
46726f6d3a20224d pack('H*', $hex_str):将十六进制串解码为对应的ASCII字符
内容的提问来源于stack exchange,提问作者Mike Manning
相关产品推荐
相关产品推荐

