Php 如何将十六进制字符串(或二进制数)转换为有符号短字符?(菲律宾)

Php 如何将十六进制字符串(或二进制数)转换为有符号短字符?(菲律宾),php,binary,hex,unpack,Php,Binary,Hex,Unpack,我试图在PHP中将16位(=有符号短)的十六进制字符串转换为有符号十进制数 (例如:0xFEF5->-267)(如果需要转换二进制文件,则0xFEF5->1111111110101->-267) 我创建了pack和unpack功能。然后,我写了一些代码,但它是分开的作品 $bin = hex2bin('0020'); //0020 -> 32(dec) 0000 0000 0010 0000(bin) $res = unpack("c2char", $bin); //-> $res

我试图在PHP中将16位(=有符号短)的十六进制字符串转换为有符号十进制数

(例如:0xFEF5->-267)(如果需要转换二进制文件,则0xFEF5->1111111110101->-267)

我创建了
pack
unpack
功能。然后,我写了一些代码,但它是分开的作品

$bin = hex2bin('0020'); //0020 -> 32(dec) 0000 0000 0010 0000(bin)
$res = unpack("c2char", $bin);
//-> $res = ['char1':0,'char2':32] it works!

$bin = hex2bin('FFE3'); //FFE3 -> -29(dec) 1111 1111 1110 0011(bin)
$res = unpack("c2char", $bin);
//-> $res = ['char1':-1, 'char2':-29] it works!
但当设置
s
参数为
unpack
时,由于16位数据,它不起作用

$bin = hex2bin('0020');
$res = unpack("s*short", $bin);
//-> $res = ['short1': 8192] //not works

$bin = hex2bin('FFE3');
$res = unpack('s*short", $bin);
//-> $res = ['short1': -7169] //not works...
如果有其他方法将十六进制转换为带符号的十进制,而不使用
解包
,则可以。我不喜欢使用
解包
。
或者,如果有其他方法将二进制转换为带符号的十进制,也可以

我在谷歌花了一段时间,但我找不到有效的解决方法

有人能帮我吗?
谢谢。

您是否尝试过php手册中的hexdec函数
hexdec()
将在这里实现这个技巧,但只是为了让您理解:
s
函数的
s
格式是机器字节顺序,在您的情况下,它是小尾端,而您更喜欢大尾端。遗憾的是,16位大端有符号整数没有格式$res=unpack('s*short',$bin);//$res->-29它可以工作!
谢谢你黑洞!我想不出那个窍门。谢谢你的帮助!