Хотите записать в файл, конвертируя целочисленный список из Hex в Char - PullRequest
0 голосов
/ 03 июля 2018

Итак, у меня есть список, полный целых чисел. Эти целые числа являются шестнадцатеричными. Я хотел бы преобразовать этот список в символы ASCII. Как только это будет сделано, я хотел бы записать символы ASCII в файл. Вот что у меня есть:

    public byte[] buffer;
    public List<int> list= new List<int>(new int[3]);
    list[0] = 5445535420;        //AKA header[0] represents the hex integers for Test_  where _ is a space
    list[1] = 0;                 // so the char would be null
    list[2] = 4a4153;            // would be JAS


    System.IO.FileStream fs;
    fs = new FileStream(filename, FileMode.OpenOrCreate);
    if (fs.CanWrite)
    {
         for (int i=0;i<list.Count();i++)
         {
              buffer = Encoding.ASCII.GetBytes(list[i].ToString());
              Convert.ToChar(header[i]);
              fs.Write(buffer, 0, buffer.Length);
         }             
     }

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

Будет ли это работать для вас? Надеюсь, что комментарии самоочевидны

    int intFromHexLiteral = 0x4a4153;
    var hexString = intFromHexLiteral.ToString("X"); // "4A4153"
    var hexCharsList = Split(hexString, 2).ToList(); // ["4A", "41", "53"]
    var charsArray = hexCharsList
        .Select(hexChar => Convert.ToInt32(hexChar, 16)) // [74, 65, 83]
        .Select(i => (char) i) // ['J', 'A', 'S']
        .ToArray();
    var word = new string(charsArray); // "JAS"

    private static IEnumerable<string> Split(string str, int chunkSize) =>
        Enumerable.Range(0, str.Length / chunkSize)
            .Select(i => str.Substring(i * chunkSize, chunkSize));
0 голосов
/ 03 июля 2018

Я вижу, что вы выбрали ответ, но я хотел показать вам этот метод решения вашей проблемы, касающийся ваших данных строго в виде числовых данных. Значения, которые вы вставляете в List<int>, достаточно малы, чтобы поместиться в long, поэтому я изменил его на List<long>. Если они когда-нибудь станут больше, чем это, то это решение не сработает.

Посмотрите, как я разбил каждый long элемент, побайтный, в обратном порядке и сохранил преобразование в StringBuilder перед записью его на экран. В вашем случае вы бы вместо этого записали в файл, но могли бы использовать тот же метод преобразования.

using System;
using System.Collections.Generic;
using System.Text;

public class Program
{
    public static void Main(string[] args)
    {
        List<long> list = new List<long>(new long[3]);
        list[0] = 0x5445535420;         // AKA header[0] represents the hex integers for Test_  where _ is a space
        list[1] = 0;                    // so the char would be null
        list[2] = 0x4a4153;             // would be JAS

        for (int i = 0; i < list.Count; i++)
        {
            StringBuilder sb = new StringBuilder();
            // Break down each element byte by byte in reverse
            while (list[i] > 0)
            {
                // Anding against 0xFF to only have the least significant byte to convert into a char
                sb.Insert(0, Convert.ToChar(list[i] & 0xFF));
                list[i] >>= 8;  // Remove the least significant byte
            }
            Console.WriteLine(sb);
        }
    }
}

Результат:

TEST

JAS
0 голосов
/ 03 июля 2018

Целое число не равно байту символов ASCII. Т.е. 1010 не является 0x1010 в гексагоне. В вашем случае было бы более разумно использовать byte [] для явной записи каждого шестнадцатеричного символа.

class Program
{
    static void Main(string[] args)
    {
        List<byte[]> list = new List<byte[]>();
        list.Add(new byte[]{0x54, 0x45, 0x53, 0x54, 0x20}); //AKA header[0] represents the hex integers for Test_  where _ is a space
        list.Add(new byte[]{0x0});                          // so the char would be null
        list.Add(new byte[]{ 0x4a, 0x41, 0x53 });           // would be JAS

        foreach (var b in list)
        {
            var chars = Encoding.ASCII.GetChars(b);
            var s = new string(chars);
            Console.WriteLine(s);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...