Шутка терпит неудачу для одной и той же строки

#node.js #string #jestjs #buffer

Вопрос:

Я впервые пробую модульное тестирование с помощью Jest в личном проекте, и некоторые из моих тестов провалились, хотя полученные данные были точно такими же, как ожидалось, вот пример:

 test("decrypt method works correctly", () =>{
    const myAES = new rijndael("", "0bdfa595235c307a105d593fb78fbb13", { key: "SOME 128 BIT KEY", bits: 128, rounds: 9 })
    expect(myAES.decrypt()).toStrictEqual({
        "c": "0bdfa595235c307a105d593fb78fbb13",
        "p": "ATTACK AT DAWN!",
        "errors": []
    })
}
 

Шутливый отчет

Поэтому я попытался проверить, не проблема ли это с шуткой или моим кодом:

 const r = myAES.decrypt()
console.log(typeof r.p) // string
console.log(r.p === "ATTACK AT DAWN!") // false
 

Что еще больше сбило меня с толку, так как струны выглядят одинаково. Код, который я тестирую, представляет собой функцию шифрования AES (не волнуйтесь, это просто личный проект для развлечения, который не будет использоваться в производстве), которая обрабатывает текст в виде буферов NodeJS и в конце использует метод toString() для преобразования его обратно в строку. Я думаю, что, возможно, именно поэтому у меня возникли проблемы, но, похоже, не могу понять, почему именно. Было бы здорово, если бы кто-нибудь мог указать мне правильное направление, чтобы я мог избавиться от этой ошибки. Заранее спасибо.

P.S. Я пока избавлю всех от необходимости читать мою реализацию AES, так как не думаю, что это проблема с шифрованием, но дайте мне знать, если это необходимо

Комментарии:

1. Не уверен, что элемент » p » является ошибкой, вы проверили полную структуру, так как строгие требования означают, что все должно совпадать.

2. Можете ли вы преобразовать оба в шестнадцатеричный формат и посмотреть, есть ли какая-либо разница между ними. Используйте этот пример для сброса строки в шестнадцатеричный формат <string>.split('').reduce((h,c)=>h =c.charCodeAt(0).toString(16).padStart(2,'0'),'')

3. Ах да, я должен был об этом подумать! Я попробую это сделать, тх 🙂

Ответ №1:

Итак, оказывается, это была глупая ошибка, когда я пропустил серию нулевых байтов, которые, как правило, оказываются в конце буфера после расшифровки. В то время как toString() превратит буфер в строку, которую я хочу, компьютер не распознает ее как ту же строку. Поэтому все, что мне нужно было сделать, это удалить следующие нулевые байты. Предполагая, что нулевые байты должны отображаться только в конце строки, как обычно:

 const i = buffer.indexOf(0x00)
const result = buffer.slice(0, i).toString() //solves the problem