我有一个Java程序,以空格分隔的十六进制格式,通过网络接收16字节的原始数据包.由于我不想更改该代码,因此我将结果传递给Perl脚本,unpack从理论上讲,这可以简单地将其STDIN转换为可识别的变量.以下是我的Perl文件的输入行示例:
FF FF 09 7D 10 01 07 01 00 02 00 1D 00 00 00 00 00 06 00 07 00 |--garbage-----|c--|c--|int---|int---|int---|int---|int---|int---|int---|
(c表示char/byte,int表示16位整数变量)
我最初想用来unpack干净地将每个输入行分成我需要的变量.但是,由于字符串中的空格分隔,我不知道如何处理它(我可以使用'A'作为模板,但我不妨使用split!)
有优雅的使用方式unpack()吗?我不是Perl的主人,但另一种方法是,正如我之前建议的那样,使用split然后手动将每个十六进制转换为一个字节,然后使用位操作和掩码来获得我想要的东西.任何其他建议(如果unpack没有保存一天)?
我有一个C结构,通过一些中间网络发送,并通过Java代码通过串行链接接收.Java代码给了我一个字节数组,我现在想把它重新打包为原始结构.现在,如果接收代码在C中,这很简单.有没有简单的方法将java中的byte []重新打包为C结构.我在java方面的经验很少,但这似乎不是常见的问题,或者在我能找到的任何常见问题解答中都解决了.
仅供参考,C结构是
struct data {
uint8_t moteID;
uint8_t status; //block or not
uint16_t tc_1;
uint16_t tc_2;
uint16_t panelTemp; //board temp
uint16_t epoch#;
uint16_t count; //pkt seq since the start of epoch
uint16_t TEG_v;
int16_t TEG_c;
}data;
Run Code Online (Sandbox Code Playgroud) 因此,在以下情况中,我有一些问题可以确定Perl的作用:
while(1){
$inputLine=<STDIN>
#parse $inputLine below
#BUT FIRST, I need to check if $inputLine = EOF
}
Run Code Online (Sandbox Code Playgroud)
在我得到明显的使用答案之前while(<>){},让我说有一个非常强大的理由,我必须做上述事情(基本上设置一个警报来中断阻止,我不希望代码混乱的例子).
有没有比较$inputLine == undef(因为我认为这是STDIN最后返回的).
谢谢.