c # текст в представление int64 - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь преобразовать string "Eureka" в его UTF-8 Int64 представление.

Я пытаюсь следующий код:

  string message = "Eureka"; // if I use "Eureka\0\0" it works...
  byte[] bytes = System.Text.Encoding.UTF8.GetBytes(message);

  // this fails because I have 6 bytes, not 8 (as required for Int64)
  Int64 m = BitConverter.ToInt64(bytes, 0); 

  byte[] decodeBites = BitConverter.GetBytes(m);

  string decodeMessage = System.Text.Encoding.UTF8.GetString(decodeBites);

  if (!decodeMessage.Equals(message)) {
    Console.WriteLine("Message mis-match!!!");
  }

Сейчаспотому что моя строка слишком короткая, у меня нет нужного количества байтов, и это не удается.Если я добавлю 2 символа, это будет работать, но тогда у меня не будет нужной строки в decodeMessage ... Я уверен, что мне нужен какой-то трюк преобразования, чтобы удалить завершающие байты "0" после преобразования, но ни одна из моих попытокРабота.Любая помощь будет принята с благодарностью !!

ОБНОВЛЕНИЕ Цель - ДЕЙСТВИТЕЛЬНО иметь целочисленное представление "Euraka", а не "Eureka \ 0 \ 0", а затем обрезать в конце .... Цель состоит в том, чтобы использовать RSA-метод на полученном Int64, так что на другом конце люди не будут знать, что им нужно что-то обрезать ...!

1 Ответ

0 голосов
/ 21 ноября 2018

Давайте pad массив с 0 (чтобы массив содержал 8 байтов) и trim строка из \0:

string message = "Eureka"; // if I use "Eureka\0\0" it works...

byte[] bytes = System.Text.Encoding.UTF8.GetBytes(message);

byte[] pad = new byte[bytes.Length < sizeof(Int64) ? sizeof(Int64) - bytes.Length : 0];

// Concat(new byte[...]) - ensure m contains 8 bytes
Int64 m = BitConverter.ToInt64(
  bytes.Concat(pad).ToArray(), 
  0); 

byte[] decodeBites = BitConverter.GetBytes(m);

// Since we have 8 bytes always, we have to get rid of tail '\0'
string decodeMessage = System.Text.Encoding.UTF8.GetString(decodeBites).TrimEnd('\0');

if (!decodeMessage.Equals(message)) {
  Console.WriteLine("Message mis-match!!!");
}

Редактировать: Поскольку Int64 имеет 8 , а "Eureka" закодировано только в 6 , вам нужно будет избавиться 2 ноль байтов.Если вы не хотите Trim, вы можете Skip их, например

byte[] decodeBites = BitConverter
  .GetBytes(m)
  .TakeWhile(b => b != 0) 
  .ToArray(); 

string decodeMessage = System.Text.Encoding.UTF8.GetString(decodeBites);
...