仅当公司名称以拉丁字母书写时,附加代码才有效,但如果公司名称为阿拉伯语,则无法正常工作。任何人都可以建议并在代码中添加适当的部分,我是这个领域的初学者。
标签长度值(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/Ag8zMTAxMjIzOTM1MDAwMDDMDEzIwMjEtMTItMTAgMDE6MjY6NDQEBjEwMC4wMAUFMTUuMDA=
通过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();
}
}
}