这个示例总共问了 Claude 3.5 Sonnet 2次,第一次 十六进制字符串转换为字节数组 函数错误,然后提示了下,第2次就正确了。
发现Claude 3.5 Sonnet很贴心,注释,解释都很本地化,并给出恰当的示例,感觉对中文的理解能力很强。
Claude 3.5 Sonnet 对于记不住一些函数,计算等确实提供了很大的便利。
当然,提示词很重要。
import win.ui;
import console
/*DSG{{*/
var winform = win.form(text="Modbus CRC-16 校验示例";right=759;bottom=469)
winform.add(
button={cls="button";text="计算 CRC";left=10;top=50;right=100;bottom=80;z=2};
edit={cls="edit";left=10;top=10;right=749;bottom=40;edge=1;z=1};
static={cls="static";text="CRC 结果:";left=110;top=55;right=749;bottom=75;z=3}
)
/*}}*/
// Modbus CRC-16 校验函数
modbusCRC16 = function(data) {
var crc = 0xFFFF;
for(i=1; #data; 1) {
crc = crc ^ data[i];
for(j=1; 8; 1) {
if(crc & 0x0001) {
crc = (crc >> 1) ^ 0xA001;
} else {
crc = crc >> 1;
}
}
}
return crc;
}
// 将十六进制字符串转换为字节数组
function hexStringToTable(hexStr) {
var parts = string.split(hexStr," ");
var table = {};
for(i = 1; #parts; 1) {
table[i] = tonumber(parts[i],16);
}
return table;
}
// 按钮点击事件
winform.button.oncommand = function(id,event){
var inputStr = winform.edit.text;
var tab = hexStringToTable(inputStr)
var crc = modbusCRC16(tab);
// CRC 结果(低字节在前,高字节在后)
var crcLow = crc & 0xFF;
var crcHigh = (crc >> 8) & 0xFF;
var result = string.format("CRC: 0x%04X (低字节: 0x%02X, 高字节: 0x%02X)",crc, crcLow, crcHigh);
//var result = string.format("%02X",crcLow) ++ " " ++ string.format("%02X",crcHigh)
winform.static.text = result;
}
// 设置默认文本
winform.edit.text = "01 31 F0 00 00 00 00 14 00 1E 00 00 00 32 00 3C 00 00 00 50 00 5A";
winform.show();
win.loopMessage();