В .net я хочу декодировать некоторые необработанные данные, закодированные приложением C ++. Приложение C ++ - 32-разрядное, а приложение C # - 64-разрядное.
Приложение C ++ поддерживает русские и испанские символы, но не поддерживает символы Unicode. Этот двоичный читатель C # не может читать русские или испанские символы и работает только с английскими символами ascii.
CArchive не указывает кодировку, и я не уверен, как ее читать с C #.
Я тестировал это на нескольких простых строках, которые предоставляет C ++ CArchive:
Для «ABC»: «03 41 42 43»
Для «БАМ 7555В»: «0B C1 E5 EB C0 C7 20 37 35 35 35 C2»
Ниже показано, как приложение C ++ записывает двоичный файл.
void CColumnDefArray::SerializeData(CArchive& Archive)
{
int iIndex;
int iSize;
int iTemp;
CString sTemp;
if (Archive.IsStoring())
{
Archive << m_iBaseDataCol;
Archive << m_iNPValueCol;
iSize = GetSize();
Archive << iSize;
for (iIndex = 0; iIndex < iSize; iIndex++)
{
CColumnDef& ColumnDef = ElementAt(iIndex);
Archive << (int)ColumnDef.GetColumnType();
Archive << ColumnDef.GetColumnId();
sTemp = ColumnDef.GetName();
Archive << sTemp;
}
}
}
И вот как я пытаюсь прочитать это на C #.
Следующее может декодировать "ABC", но не русские символы. Я протестировал this.Encoding
со всеми доступными параметрами (Ascii, UTF7 и т. Д.). Русские символы работают только для Encoding.Default. Но очевидно, что это не самый надежный вариант, поскольку кодирование и декодирование обычно происходит на разных компьютерах.
public override string ReadString()
{
byte blen = ReadByte();
if (blen < 0xff)
{
// *** For russian characters it comes here.***
return this.Encoding.GetString(ReadBytes(blen));
}
var slen = (ushort) ReadInt16();
if (slen == 0xfffe)
{
throw new NotSupportedException(ServerMessages.UnicodeStringsAreNotSupported());
}
if (slen < 0xffff)
{
return this.Encoding.GetString(ReadBytes(slen));
}
var ulen = (uint) ReadInt32();
if (ulen < 0xffffffff)
{
var bytes = new byte[ulen];
for (uint i = 0; i < ulen; i++)
{
bytes[i] = ReadByte();
}
return this.Encoding.GetString(bytes);
}
//// Not support for 8-byte lengths
throw new NotSupportedException(ServerMessages.EightByteLengthStringsAreNotSupported());
}
Как правильно это расшифровать? Как вы думаете, правильный ли выбор кодовой страницы поможет решить эту проблему? Если да, то как узнать, какая кодовая страница использовалась для кодирования?
Благодарю, если кто-то может показать мне правильное направление, чтобы это сделать.
Изменить
Думаю, этот вопрос и "Абсолютный минимум, что каждый разработчик программного обеспечения должен абсолютно точно знать о Unicode и наборах символов (Нет Извинения!) " статья развеивает некоторые сомнения. По-видимому, нет способа найти правильную кодовую страницу для существующих данных.
Думаю, теперь возникает вопрос: есть ли какая-либо кодовая страница, поддерживающая все испанские, русские и английские символы? Могу ли я указать кодовую страницу в классе C ++ CArchive?
sizeof(int)
может (и, вероятно, будет) отличаться, поэтому вы будете неправильно разбирать двоичный файл. stackoverflow.com/questions/589575/ - person Cory Kramer   schedule 05.10.2016Encoding.GetEncoding(866)
. - person Anton Gogolev   schedule 05.10.2016