Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将阿拉伯语文本转换为十六进制_C#_Winforms - Fatal编程技术网

C# 如何将阿拉伯语文本转换为十六进制

C# 如何将阿拉伯语文本转换为十六进制,c#,winforms,C#,Winforms,我正在处理c#上的收据申请。我有英文和阿拉伯文的收据示例,如下所示 我有json文本,我尝试将json文本转换为十六进制,并通过套接字消息以十六进制格式发送。 我的问题是我试图将文本转换为十六进制,但无法成功转换。下面是如何将文本转换为十六进制 string hexOutput = ""; byte[] ba = Encoding.Default.GetBytes(output); hexOutput = BitConverter.ToString(ba); hexOutp

我正在处理c#上的收据申请。我有英文和阿拉伯文的收据示例,如下所示

我有json文本,我尝试将json文本转换为十六进制,并通过套接字消息以十六进制格式发送。 我的问题是我试图将文本转换为十六进制,但无法成功转换。下面是如何将文本转换为十六进制

string hexOutput = "";
byte[] ba = Encoding.Default.GetBytes(output);
hexOutput = BitConverter.ToString(ba);
hexOutput = hexOutput.Replace("-", "");
下面是我的json示例

"PaymentReceipt":[
    {
       "DocumentQualifier":"CustomerReceipt",
       "OutputContent":{
          "OutputFormat":"Text",
          "OutputText":[
             {
                "Text":"------------------------------------------------------------"
             },
             {
                "Text":"XXXXXXXXXX2345"
             },
             {
                "Text":"Purchase Amount                    مبلغ الشراء"
             },
             {
                "Text":"5.00"
             },
             {
                "Text":""
             },
             {
                "Text":"Thanks for your visit             شكرا لزيارتكم"
             }
          ]

如何将文本正确转换为十六进制?

阿拉伯语字符位于UTF 8字符上,为此,您首先必须将其转换为字节数组,如下所示

byte[] bytes = Encoding.UTF8.GetBytes(output);
然后将其转换为base64字符串或任何需要转换的字符串

用于转换为base64字符串

string base64Str = Convert.ToBase64String(bytes);
byte originalByte = Convert.FromBase64String(base64Str);
用于从base64字符串获取原始字节

string base64Str = Convert.ToBase64String(bytes);
byte originalByte = Convert.FromBase64String(base64Str);
用于从字节数组获取UTF8原始输出

string originalResult = Encoding.UTF8.GetString(bytes);
在一行中,您可以获得base64字符串并按如下方式恢复

编码

string encodedStr = Convert.ToBase64String(Encoding.UTF8.GetBytes(output));
解码

string OriginalString = Encoding.UTF8.GetString(Convert.FromBase64String(encodedStr));

UTF-8是网络上使用最广泛的编码。检查

代码

HexManager静态类包含用于从/转换为十六进制的帮助程序扩展方法

using System;
using System.Text;

public static class HexManager
{
    public static String ToHex(this byte[] data)
    {
        StringBuilder ret = new StringBuilder(String.Empty);
        foreach (byte Value in data)
        {
            ret.Append(Value.ToString("x2"));
        }
        return ret.ToString();
    }

    public static byte[] FromHex(this string data)
    {
        int Pair = data.Length % 2;
        byte[] ret = new byte[data.Length / 2];
        if (Pair == 0)
        {
            for (int i = 0; i < data.Length / 2; i++)
            {

                ret[i] = Convert.ToByte(data.Substring(i * 2, 2), 16);
            }
        }
        else
        {
            throw new SystemException("Invalid hex string.");
        }
        return ret;
    }

    public static byte[] ToByteArray(this string data)
    {
        return Encoding.UTF8.GetBytes(data);
    }

    public static string ToStr(this byte[] data)
    {
        return Encoding.UTF8.GetString(data);
    }
}

public class Example
{
    public static void Main()
    {
        Console.OutputEncoding = System.Text.Encoding.UTF8; //Use Windows Terminal for correct output of UTF-8. No problem on Linux or MacOS Default is UTF-8.
        string data = "Purchase Amount                    مبلغ الشراء";
        Console.WriteLine("Original: " + data);
        data = data.ToByteArray().ToHex();
        Console.WriteLine("Encoded: " + data);
        data = data.FromHex().ToStr();
        Console.WriteLine("Decoded: " + data);

        Console.WriteLine();
        Console.WriteLine();

        data = "Thanks for your visit             شكرا لزيارتكم";
        Console.WriteLine("Original: " + data);
        data = data.ToByteArray().ToHex();
        Console.WriteLine("Encoded: " + data);
        data = data.FromHex().ToStr();
        Console.WriteLine("Decoded: " + data);

        Console.ReadKey();
    }
}

编码。默认值似乎不是个好主意。它在DocueMStation页面上显示:“不同的计算机可以使用不同的编码作为默认编码,并且默认编码可以在一台计算机上更改。如果使用默认编码对计算机之间的数据流进行编码和解码,或者在同一台计算机上的不同时间检索到的数据进行编码和解码,则可能会错误地转换该数据。”您会问如何正确地将其转换为十六进制,但这不是一个简单的问题。十六进制表示二进制数据,但首先需要将文本转换为二进制数据(
byte[]
)。您可以使用文本编码器的
GetBytes
方法来实现这一点,正如您在代码中尝试的那样。问题是:您没有提到应该使用什么编码。我猜是UTF8,但不同的人类语言可能有特定的编码,这些编码是为它们生成的,并且是您调用的服务所期望的。文档要求的编码是什么?您是否计划用编码要求更新问题?Hi@Llama抱歉,我之前无法检查,但我尝试了encoding.UTF8.GetBytes(),再次无法正确转换。因此,正确的编码是什么?你必须告诉我们。我们不能告诉您,因为这完全取决于您将数据传递给的服务的要求。为什么是UTF8?一般来说,Unicode是可以的,当然可以。但我真的不确定在处理阿拉伯语时UTF8是否更可取。@Fildor对于混合数据,使用UTF-8;对于纯阿拉伯语文本,使用UTF-16以获得最佳空间效率。UTF-8可以表示所有1M+。UTF-8在网络上被广泛使用。你能澄清一下“阿拉伯语字符是基于UTF 8字符的”是什么意思吗。谢谢@Joma。我的问题是,我尝试用UTF8编码是可以的,但当我从响应端解码时,我没有用UTF8解码,因为值看起来像?????而不是编码为任何json属性的十六进制,您可以:1。生成所有Json内容2。将所有json内容转换为十六进制3。在服务器中,将十六进制字符串解码为原始字符串(json内容)@saulyasar您的意思是说,在将字符串从十六进制转换回控制台窗口后,在控制台窗口中呈现该字符串是一个问题吗?在Windows上,默认编码为UTF-16。Classic cmd.exe或powershell无法正确显示输出。Windows终端解决了这个问题,它可以管理UTF-8或UTF-16以正确打印字符。最初的想法是用十六进制编码所有生成的JSON内容,而不是将JSON内容的特定属性编码为十六进制,管理起来更复杂。