#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