c# 文本到 int64 表示

c# text to int64 representation

我正在尝试将 string "Eureka" 转换为其 UTF-8 Int64 表示形式。

我正在尝试以下代码:

  string message = "Eureka"; // if I use "Eureka[=10=][=10=]" 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”字节,但是 none 我的尝试成功了。任何帮助将不胜感激!!

更新 目标真的是 "Euraka" 的整数表示,而不是 "Eureka[=27=][=27=]" 然后 trim 最后......目标是对获得的 [=13 使用 RSA 方法=],所以在另一端,人们不会知道他们必须 trim 任何...!

让我们用 pad 数组 0(确保数组包含 8 字节)和 trim 来自 [=14=] 的字符串:

string message = "Eureka"; // if I use "Eureka[=10=][=10=]" 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 '[=10=]'
string decodeMessage = System.Text.Encoding.UTF8.GetString(decodeBites).TrimEnd('[=10=]');

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

编辑: 因为 Int648"Eureka" 编码在 6仅 ,您必须 摆脱 2 零字节。如果你不想要 Trim 你可以 Skip 他们例如

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

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