So it all turned out to be a single bit error in the first message that
prevented me from finding the algorithm.
The annoying thing was that I used pretty much the same algorithm that
Peter provided but since I mostly looked for match of the first message and
then that CRC bytes were swapped made me miss the fact that the second
message actually matched.
Thanks Peter for spotting this!
I also got crc reveng to work eventually.
./reveng -w 16 -s 6cd90240c84050030d28
./reveng: warning: you have only given 1 sample
./reveng: warning: to reduce false positives, give 4 or more samples
width=16 poly=0x8005 init=0x0000 refin=true refout=true
xorout=0x0000 check=0xbb3d residue=0x0000 name="CRC-16/ARC"
MattisMacBook:reveng-2.1.0 mattis$ ./reveng -w 16 -s 6CD90240404070032688
./reveng: warning: you have only given 1 sample
./reveng: warning: to reduce false positives, give 4 or more samples
./reveng: no models found
$ ./reveng -w 16 -s 6CD90240404050032688
./reveng: warning: you have only given 1 sample
./reveng: warning: to reduce false positives, give 4 or more samples
width=16 poly=0x8005 init=0x0000 refin=true refout=true
xorout=0x0000 check=0xbb3d residue=0x0000 name="CRC-16/ARC"
Then from there it took a bit of fiddling with options to make crc reveng
to actually be able to get it to generate the same output:
$ ./reveng -w 16 -P a001 -i 0000 -x 0000 -l -d
width=16 poly=0x8005 init=0x0000 refin=true refout=true
xorout=0x0000 check=0xbb3d residue=0x0000 name=(none)
$ ./reveng -w 16 -P a001 -i 0000 -x 0000 -l -c 6CD9024040405003
2688
For some reaason I had to swap the bit order of the polynom to get it
working which I got when I used the -d option when using -P 8005 it showed
a001. I tried to swap that and voila it worked!
A lesson for me is then to have more message samples to spot errors easier
and also never assume there is such things that error free serial links
even though the cable was just one meter and the speed 9600 bps.
/Mattis
Den tis 28 jan. 2020 kl 03:21 skrev Peter Coghlan via cctalk <
cctalk at classiccmp.org>:
Mattis Lind wrote:
> I have two actual messages from equipment
employing IBM BSC:
> 32016CD90240404070032688
> and
> 32016CD90240C84050030D28
>
How about this code:
#include <stdio.h>
int crc16(unsigned char *ptr, int count)
{
unsigned int crc;
char i;
crc = 0x0000;
while (--count >= 0)
{
crc = crc ^ (unsigned int) *ptr++;
i = 8;
do
{
if (crc & 0x0001)
crc = (crc >> 1) ^ 0xA001; /* 0x8005 bit reversed */
else
crc = (crc >> 1);
} while(--i);
}
return (crc);
}
void main()
{
/* 32 01 6C D9 02 40 40 40 70 03 26 88 */
unsigned char data1[] = {0x6c, 0xd9, 0x02, 0x40, 0x40, 0x40, 0x50,
0x03};
/* 32 01 6C D9 02 40 C8 40 50 03 0D 28 */
unsigned char data2[] = {0x6c, 0xd9, 0x02, 0x40, 0xc8, 0x40, 0x50,
0x03};
printf("crc sent: 8826 computed: %4.4x\n", crc16(data1, sizeof(data1)));
printf("crc sent: 280d computed: %4.4x\n", crc16(data2, sizeof(data2)));
return;
}
Please note that I had to cheat to get this to work. It worked initially
for the second case but it only worked for the first case when I tweaked
70 to 50, ie I substituted the corresponding value from the second case.
Regards,
Peter Coghlan.