Delphi的CBOR库返回的答案与Nodejs不同



我们正在解码一个二维码,并从Delphi库收到一个意外(不正确(的答案。Nodejs是预期的响应。

地图位置192处的Delphi结果文本转换为Ascii101110,86,4108118,79,82,70,53102111,82,68103,99,57,70,89120,84,67,53,77,54,48118,55102110,88,8131113116,116,75,99,52117,78,84,55,5310,51118115,82,95104,85,48,75,65101119116,95107,50108,74102,45,84,81122,65122121109105,50101107,90,85,67,49118116,80108,70,87103,77

Nodejs结果和地图位置192处的预期答案122、117、83、150、243、145、23、151、232、68、56、28、244、86、49、76、46、76、235、75、251、126,117210170219、74115、139、141、79、190、94222、251、17254、21、52、40、77176、183、249,54、148、151、254、77、12、192、207、41、162、217233、25、80、45、111、180、249、69、90、3

将此QR字符串解码为地图需要192处的结果3个月jiyoqmjmgfwdjrdw3f2dc7阵列mec6tvkolpheixs7ueioa46rldctbojtvux636OXJKVW2KOOFY2T56L3PPWEP6CU2CQB5QW74TNFEX7ZGQZQGPFGRNT2IZKAWW7NHZIVNAGGGCQMMQIAKYELWQDEP3OFVEUZQ6YX5WINVT6YRF5P6BBJ7NUYGSWS5V435T5T53CId7 laro2 mr7 nywustgd3 c7 wzbwwwp3cexv7 yefh5 wta2k2 wxtpwpwpxmjap4mhlaqynqmiege6uimiuwcxplmqkaneaakrq2qymqmgyst23ecqdiqacymhyfynzmdw6qaaari2月6日25日ywustgd3c7wzbwp3cexv7yefh5wta2k2lwxtpwpwpxmjap4

有人能帮忙吗?

这是Delphi代码:


s:= '3ECQDIYBQEIRQ5MBDBXBQ7FIAGBRCFQUDBYIEA2Q2C5A4FSECFA4PKHNWFC5NRLIMIMHF';
s:= s+'JIYOQMJMGFWDJRDW3F2DC7BRRAYYBMEC6TVKOLPHEIXS7UEIOA46RLDCTBOJTVUX636';
s:= s+'OXJKVW2KOOFY2T56L3PPWEP6CU2CQB5QW74TNFEX7ZGQZQGPFGRNT2IZKAWW7NHZIVN';
s:= s+'AGGGCQMMQIAKYELWQDEP3OFVEUZQ6YX5WINVT6YRF5P6BBJ7NUYGSWS5V435T5T53CI';
s:= s+'D7LARO2AMR7NYWUSTGD3C7WZBWWP3CEXV7YEFH5WTA2K2LWXTPWPWPXMJAP4MHLAQYN';
s:= s+'QMIEGE6UIMIUWCXPLMQKANEAAKRQ2QYMQMGYST23ECQDIQACYMHYFIYNZMDW6QAAARI';
s:= s+'2BF6MUQEYTGQQJUPRSJZIF7O6NYGCM3RG465H2UOKF6OEQX6BGS55OD23CFVZBNFT6O';
s:= s+'25L2TUF2PVJ3CXAEF63FRRFAVDCRBUYVUW24RRJA2MI5WZOIYVCBBSBABLARO2AMR7N';
s:= s+'YWUSTGD3C7WZBWWP3CEXV7YEFH5WTA2K2LWXTPWPWPXMJAP4';
//Decode Base32
bytes := TBase32.Rfc4648.Decode( s );

//删除前三个字节并存储在生成的arry中cborBytes2:=复制(字节,3(;

//get Cbor Map
items := TCborDecoding.DecodeData( @cborBytes2[0],Length(cborBytes2) );
memLog.Lines.Add('Found type ' + intToStr(Integer(items.CBorType)));
case items.cborType of
majMap:         MemLog.Lines.Add('Map: Length: ' + IntToStr( (items as TCborMap).Count) + ': ' + items.ToString);
majUnsignedInt: MemLog.Lines.Add('UINt: ' + items.ToString );
majNegInt:      MemLog.Lines.Add('negINt: ' + items.ToString );
majByteStr:     rawData := items.ToString;
majUTFEncStr:   MemLog.Lines.Add('UTF8: ' + items.ToString);
majArray:       MemLog.Lines.Add('ARR: Length: ' + IntToStr( (items as TCborArr).Count ) + ': ' + items.ToString);
majTag:         MemLog.Lines.Add('Tag - not implemented');
majFloat:       MemLog.Lines.Add('Float: ' + items.ToString );
end;
itemsMap := ((items as TCborMap).ValueByName['124']) as TCborMap;
bytesAsStr := (itemsMap.ValueByName['114'] as TCborMap).ValueByName['192'].ToString;
memo1.Lines.Add(bytesAsStr);

这是node.js代码

base32EncodedCredential="3个月大的一天"wbc5uavs7k2yypfzwy57gctbin6dj7ze2rssc45k56wxvqnccnw2r253ayowbbq3ayqimj5iqyrjmfg6wzaua2iaivbecausto23ecqdiqbcycrqiila5xuaaavpleedlcrrjsc5xpbxlsbx3uqjelquxfzd2vnclkau75lfcpdkpzuwurtpwc762yd4znalvp7en45fp3jjoeqmjifiyuingvhe64mkigtalonpogfiqimqiakyelwqcwl5llc54xg3bdx4ykmfbxynh7etkgilq3vlx226wbuijw3khlxm';

const cbor=require('bor'(;const base32Decode=需要('base32-decode'(

const cborArrayBuffer=base32Decode(base32EncodedCredential,'RFC4648'(;

const cborBytes=新的Uint8Array(cborArrayBuffer.sice(3((;

console.log(cborBytes(;

const cborMap=cbor.decode(cborBytes,{useMaps:true}(;

const vcMap=cborMap.get(124(;

console.log(vcMap.get(114(.get(192((;

const proofValue=convertToMultibase(vcMap.get(114(.get(192((;

库的创建者Mike用以下回答

据我所见,这是一个自动字符串转换的问题。尝试用替换项目

//不使用宽字符串,而是按照TCborByteString的意图使用字节。。。bt:=(((itemsMap.ValueByName['114']为TCborMap(.ValueByName]为TCborByteString(.ToBytes;

对于i:=0到长度(bt(-1 doWriteln(bt[i](;

我们发现这个有效

最新更新