0

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

标签长度值(TLV)。• 消息类型代码 (T) - 1 字节固定大小为 1 字节(2 位)。• 消息值长度 (L) - 1 字节固定大小为 1 字节(2 位)。• 消息值本身。(V)-Variable(可变大小)包含将文本字符串编码成十六进制的结果

如果公司名称以拉丁字母书写,则为 TLV 示例

字符串 : Bobs Records3101223935000032021-12-10 01:26:44100.0015.00

正确结果: 十六进制: 010C426F6273205265636F726473020F3331303132323339333530303030330313323032312D31322D31302030313A32363A3434040303130352E303063130352E3

HexToBase64: AQxCb2JzIFJlY29yZHMCDzMxMDEyMjM5MzUwMDAwMwMTMjAyMS0xMi0xMCAwMToyNjo0NAQGMTAwLjAwBQUxNS4wMA==

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

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

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

字符串:شركة الأرض3101223935000032021-12-10 01:26:44100.0015.00

结果不正确但不知道问题出在哪里:

十六进制:010A3F3F3F3F203F3F3F3F3F020F3331303132323339333530303030330313323032312D31322D31302030313A32363A343404063130352E3030050E3

HexToBase64: AQo/Pz8/ID8/Pz8/Ag8zMTAxMjIzOTM1MDAwMDDMDEzIwMjEtMTItMTAgMDE6MjY6NDQEBjEwMC4​​wMAUFMTUuMDA=

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

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace tlvgenerator
{
    class Program
    {
        static void Main(string[] args)
        {
            string SallerName = gethexstring(1, "Bobs Records"); //Tag1
            string VATReg = gethexstring(2, "310122393500003"); //Tag2
            string DateTimeStr = gethexstring(3, "2022-04-25 15:30:00"); //Tage3
            string TotalAmt = gethexstring(4, "10000.00"); //Tag4
            string VatAmt = gethexstring(5, "150.00"); //Tag5
            string decString = SallerName + VATReg + DateTimeStr + TotalAmt + VatAmt;
            Console.WriteLine(decString);
            Console.WriteLine(HexToBase64(decString));
            Console.Read();


        }
        static string gethexstring(Int32 TagNo, string TagValue)
        {
            string StrTagNo = String.Format("0{0:X}", TagNo);
            String TagNoVal = StrTagNo.Substring(StrTagNo.Length - 2, 2);

            string StrTagValue_Length = String.Format("0{0:X}", TagValue.Length);
            String TagValue_LengthVal = StrTagValue_Length.Substring(StrTagValue_Length.Length - 2, 2);

            string decString = TagValue;
            byte[] bytes = Encoding.Default.GetBytes(decString);
            string hexString = BitConverter.ToString(bytes);
            hexString = TagNoVal + TagValue_LengthVal + hexString.Replace("-", "");

            return hexString;
        }

        static string gethexDec(Int32 TagValue)
        {
            string hxint = String.Format("0{0:X}", TagValue);
            return hxint.Substring(hxint.Length - 2, 2);

        }
        public static string HexToBase64(string strInput)
        {
            try
            {
                var bytes = new byte[strInput.Length / 2];
                for (var i = 0; i < bytes.Length; i++)
                {
                    bytes[i] = Convert.ToByte(strInput.Substring(i * 2, 2), 16);
                }
                return Convert.ToBase64String(bytes);
            }
            catch (Exception)
            {
                return "-1";
            }
        }

        private string StringToHex(string hexstring)
        {
            StringBuilder sb = new StringBuilder();
            foreach (char t in hexstring)
            {
                //Note: X for upper, x for lower case letters
                sb.Append(Convert.ToInt32(t).ToString("x"));
            }
            return sb.ToString();
        }
    }
}
4

3 回答 3

0

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

public class SaudiConvertion
{

    public String getTest()
    {
        // var sellername = "Salah Hospital";
        var sellername = " الجواهري العربي";
        var vatregistration = "310122393500003";
        var timestamp = "2021-12-10 01:26:44";
        var invoiceamount = "200.00";
        var vatamoun = "125.00";
 
        return getBase64(sellername, vatregistration, timestamp, invoiceamount, vatamoun);
    }

    public String getBase64(String sellername, String vatregistration, String timestamp, String invoiceamount,
        String vatamoun)
    {
        string ltr = ((char)0x200E).ToString();
        var seller = getTlvVAlue("1", sellername);
        var vatno = getTlvVAlue("2", vatregistration);
        var time = getTlvVAlue("3", timestamp);
        var invamt = getTlvVAlue("4", invoiceamount);
        var vatamt = getTlvVAlue("5", vatamoun);
        var result = seller.Concat(vatno).Concat(time).Concat(invamt).Concat(vatamt).ToArray();
        Console.WriteLine(result);
        ;
        Console.WriteLine(result.ToString());
        ;
        var output = Convert.ToBase64String(result);
        Console.WriteLine(output);
        return output;
    }



    public byte[] getTlvVAlue(String tagnums, String tagvalue)
    {
        string[] tagnums_array = { tagnums };
        var tagvalue1 = tagvalue;
 
        var tagnum = tagnums_array.Select(s => Byte.Parse(s)).ToArray();
       


        var tagvalueb = Encoding.UTF8.GetBytes(tagvalue1);
        string[] taglengths = { tagvalueb.Length.ToString() };
        var tagvaluelengths = taglengths.Select(s => Byte.Parse(s)).ToArray();
        var tlvVAlue = tagnum.Concat(tagvaluelengths).Concat(tagvalueb).ToArray();


        return tlvVAlue;
    }
}

像这样打电话

      var saudiConvertion = new SaudiConvertion();
        
        var test = saudiConvertion.getTest();

        Console.WriteLine(test);

输出 Base64:-

AR4g2KfZhNis2YjYp9mH2LHZiiDYp9mE2LnYsdio2YoCDzMxMDEyMjM5MzUwMDAwMwMTMjAyMS0xMi0xMCAwMToyNjo0NAQGMjAwLjAwBQYxMjUuMDA=

您可以使用 nugetpackage 中的 qrcodelib 来制作 qrcode 并且输出可能像这个阿拉伯语 在此处输入图像描述

扫描结果可能是这样的:来自Playstore vat zatka的 Zatka 应用 在此处输入图像描述

在 Playstore 的电子发票中扫描

在此处输入图像描述 拉丁字母 英文

在此处输入图像描述 Base64:

AQ5TYWxhaCBIb3NwaXRhbAIPMzEwMTIyMzkzNTAwMDAzAxMyMDIxLTEyLTEwIDAxOjI2OjQ0BAYyMDAuMDAFBjEyNS4wMA==

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

于 2022-01-23T09:49:52.830 回答
0

据我所知Encoding.Default,将返回系统当前 ANSI 代码页的编码。因此,为了编码和解码其他任何东西(如阿拉伯字母),您应该Encoding.Unicode改用它。

于 2021-12-10T13:41:01.247 回答
0
   static string gethexstring(Int32 TagNo, string TagValue)
        {
          
            string decString = TagValue;
            byte[] bytes = Encoding.UTF8.GetBytes(decString);
            string hexString = BitConverter.ToString(bytes);

            string StrTagNo = String.Format("0{0:X}", TagNo);
            String TagNoVal = StrTagNo.Substring(StrTagNo.Length - 2, 2);

            string StrTagValue_Length = String.Format("0{0:X}", bytes.Length);
            String TagValue_LengthVal = StrTagValue_Length.Substring(StrTagValue_Length.Length - 2, 2);


            hexString = TagNoVal + TagValue_LengthVal + hexString.Replace("-", "");
            return hexString;
        }
于 2021-12-12T04:12:20.563 回答