C#中Base64的电子发票二维码TLV,仅适用于公司名称为拉丁字母的情况

Sul*_*man 1 .net c# base64 tlv

仅当公司名称以拉丁字母书写时,附加代码才有效,但如果公司名称以阿拉伯字母书写,则附加代码无法正常工作。任何人都可以建议并将正确的部分添加到代码中,我是这个领域的初学者。

\n

标记长度值 (TLV) .\n\xe2\x80\xa2 消息类型代码 (T) - 1 字节 1 字节固定大小(2 位数字)。\n\xe2\x80\xa2 消息值长度 ( L) - 1 字节固定大小为 1 字节(2 位数字)。\n\xe2\x80\xa2 消息值本身。(V) - Variable(可变大小)包括将文本字符串编码为十六进制的结果

\n

TLV 示例(如果公司名称以拉丁字母书写)

\n

字符串:\nBobs Records3101223935000032021-12-10 01:26:44100.0015.00

\n

正确结果:\n十六进制:\n010C426F6273205265636F726473020F3331303132323339333530303030330313323032312D31322D31302030313A32363A3434040631 30302E3030050531352E3030

\n

HexToBase64:\nAQxCb2JzIFJlY29yZHMCDzMxMDEyMjM5MzUwMDAwMwMTMjAyMS0xMi0xMCAwMToyNjo0NAQGMTAwLjAwBQUxNS4wMA==

\n

通过https://www.base64decode.org从 Base64 格式解码:

\n

鲍勃记录 310122393500003 2021-12-10 01:26:44 100.00 15.00

\n

==================================\n如果公司名称以阿拉伯字母书写,则 TLV 示例:

\n

字符串:\n\xd8\xb4\xd8\xb1\xd9\x83\xd8\xa9\xd8\xa7\xd9\x84\xd8\xa3\xd8\xb1\xd8\xb63101223935000032021-12-10 01:26:44100.0015。 00

\n

结果不正确,但不\xe2\x80\x99不知道问题出在哪里:

\n

十六进制:\n010A3F3F3F3F203F3F3F3F3F020F3331303132323339333530303030330313323032312D31322D31302030313A32363A343404063130302E3030 050531352E3030

\n

HexToBase64:\nAQo/Pz8/ID8/Pz8/Ag8zMTAxMjIzOTM1MDAwMDMDEzIwMjEtMTItMTAgMDE6MjY6NDQEBjEwMC4​​wMAUFMTUuMDA=

\n

通过https://www.base64decode.org从 Base64 格式解码

\n

???? ???? 310122393500003 2021-12-10 01:26:44 100.00 15.00

\n
using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace tlvgenerator\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n            string SallerName = gethexstring(1, "Bobs Records"); //Tag1\n            string VATReg = gethexstring(2, "310122393500003"); //Tag2\n            string DateTimeStr = gethexstring(3, "2022-04-25 15:30:00"); //Tage3\n            string TotalAmt = gethexstring(4, "10000.00"); //Tag4\n            string VatAmt = gethexstring(5, "150.00"); //Tag5\n            string decString = SallerName + VATReg + DateTimeStr + TotalAmt + VatAmt;\n            Console.WriteLine(decString);\n            Console.WriteLine(HexToBase64(decString));\n            Console.Read();\n\n\n        }\n        static string gethexstring(Int32 TagNo, string TagValue)\n        {\n            string StrTagNo = String.Format("0{0:X}", TagNo);\n            String TagNoVal = StrTagNo.Substring(StrTagNo.Length - 2, 2);\n\n            string StrTagValue_Length = String.Format("0{0:X}", TagValue.Length);\n            String TagValue_LengthVal = StrTagValue_Length.Substring(StrTagValue_Length.Length - 2, 2);\n\n            string decString = TagValue;\n            byte[] bytes = Encoding.Default.GetBytes(decString);\n            string hexString = BitConverter.ToString(bytes);\n            hexString = TagNoVal + TagValue_LengthVal + hexString.Replace("-", "");\n\n            return hexString;\n        }\n\n        static string gethexDec(Int32 TagValue)\n        {\n            string hxint = String.Format("0{0:X}", TagValue);\n            return hxint.Substring(hxint.Length - 2, 2);\n\n        }\n        public static string HexToBase64(string strInput)\n        {\n            try\n            {\n                var bytes = new byte[strInput.Length / 2];\n                for (var i = 0; i < bytes.Length; i++)\n                {\n                    bytes[i] = Convert.ToByte(strInput.Substring(i * 2, 2), 16);\n                }\n                return Convert.ToBase64String(bytes);\n            }\n            catch (Exception)\n            {\n                return "-1";\n            }\n        }\n\n        private string StringToHex(string hexstring)\n        {\n            StringBuilder sb = new StringBuilder();\n            foreach (char t in hexstring)\n            {\n                //Note: X for upper, x for lower case letters\n                sb.Append(Convert.ToInt32(t).ToString("x"));\n            }\n            return sb.ToString();\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

lav*_*ava 5

您可以使用此类获得正确的输出

\n
public class SaudiConvertion\n{\n\n    public String getTest()\n    {\n        // var sellername = "Salah Hospital";\n        var sellername = " \xd8\xa7\xd9\x84\xd8\xac\xd9\x88\xd8\xa7\xd9\x87\xd8\xb1\xd9\x8a \xd8\xa7\xd9\x84\xd8\xb9\xd8\xb1\xd8\xa8\xd9\x8a";\n        var vatregistration = "310122393500003";\n        var timestamp = "2021-12-10 01:26:44";\n        var invoiceamount = "200.00";\n        var vatamoun = "125.00";\n \n        return getBase64(sellername, vatregistration, timestamp, invoiceamount, vatamoun);\n    }\n\n    public String getBase64(String sellername, String vatregistration, String timestamp, String invoiceamount,\n        String vatamoun)\n    {\n        string ltr = ((char)0x200E).ToString();\n        var seller = getTlvVAlue("1", sellername);\n        var vatno = getTlvVAlue("2", vatregistration);\n        var time = getTlvVAlue("3", timestamp);\n        var invamt = getTlvVAlue("4", invoiceamount);\n        var vatamt = getTlvVAlue("5", vatamoun);\n        var result = seller.Concat(vatno).Concat(time).Concat(invamt).Concat(vatamt).ToArray();\n        Console.WriteLine(result);\n        ;\n        Console.WriteLine(result.ToString());\n        ;\n        var output = Convert.ToBase64String(result);\n        Console.WriteLine(output);\n        return output;\n    }\n\n\n\n    public byte[] getTlvVAlue(String tagnums, String tagvalue)\n    {\n        string[] tagnums_array = { tagnums };\n        var tagvalue1 = tagvalue;\n \n        var tagnum = tagnums_array.Select(s => Byte.Parse(s)).ToArray();\n       \n\n\n        var tagvalueb = Encoding.UTF8.GetBytes(tagvalue1);\n        string[] taglengths = { tagvalueb.Length.ToString() };\n        var tagvaluelengths = taglengths.Select(s => Byte.Parse(s)).ToArray();\n        var tlvVAlue = tagnum.Concat(tagvaluelengths).Concat(tagvalueb).ToArray();\n\n\n        return tlvVAlue;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

像这样打电话

\n
      var saudiConvertion = new SaudiConvertion();\n        \n        var test = saudiConvertion.getTest();\n\n        Console.WriteLine(test);\n
Run Code Online (Sandbox Code Playgroud)\n

输出 Base64:-

\n
AR4g2KfZhNis2YjYp9mH2LHZiiDYp9mE2LnYsdio2YoCDzMxMDEyMjM5MzUwMDAwMwMTMjAyMS0xMi0xMCAwMToyNjo0NAQGMjAwLjAwBQYxMjUuMDA=\n
Run Code Online (Sandbox Code Playgroud)\n

您可以使用 nugetpackage 中的 qrcodelib 来制作 qrcode\n输出可能类似于阿拉伯语\n在此输入图像描述

\n

扫描的结果可能是这样的:Zatka app from Playstore vat zatka \n在此输入图像描述

\n

从 Play 商店扫描电子发票

\n

在此输入图像描述\n拉丁字母 英语

\n

在此输入图像描述\nBase64:

\n
AQ5TYWxhaCBIb3NwaXRhbAIPMzEwMTIyMzkzNTAwMDAzAxMyMDIxLTEyLTEwIDAxOjI2OjQ0BAYyMDAuMDAFBjEyNS4wMA==\n
Run Code Online (Sandbox Code Playgroud)\n

扫描结果如下:\n在此输入图像描述

\n

Base64 转图像\n Nuget 包\n qrcoder 文档

\n

VB.net C# 也一样。

\n
   Dim qrcode As GenerateQr = New GenerateQr()\n      var bitmapp=   qrcode.getQrBitmap(base64string)\n
Run Code Online (Sandbox Code Playgroud)\n
\n
 Dim qrcode As GenerateQr = New GenerateQr()\n      \n        Dim getBase64 As String = saudiConvertion.getBase64(company.name, company.GST,\n                                                            billDetail.KotGModel.dates,\n                                                            billDetail.KotGModel.totalAmount,\n                                                            billDetail.KotGModel.vattax)\n        Dim getQrBitmap As Bitmap = qrcode.getQrBitmap(getBase64)\n        Dim pictureBox As PictureBox = New PictureBox()\n        pictureBox.Image = getQrBitmap\n
Run Code Online (Sandbox Code Playgroud)\n