比较十六进制数,单位为帕斯卡

问题描述 投票:0回答:1

我是pascal的新手,目前正在尝试将十六进制数字与用户输入的数字进行比较。

他们输入的数字实际上将与第五,第六和第七数字相同。我试图在下面演示一下:

  • 输入的号码:90161362770229
  • 十六进制版本:5200 5400 1935
  • 用户输入的号码:540

[目前,我设法让用户输入14位数字,然后将其转换为十六进制,然后识别出串行部分。接下来,我让用户输入一个以0开头的4位数字(0540),我需要将该数字与序列号进行比较。

program licenseTransfer;

Uses sysutils, crt;

var license1, serialNumber, newNum : int64;
    serialNumber2 : String;

begin

  writeln('Enter Current License:');
  readln(license1);;

  {debug use}
  writeln('License in HEX: ', IntToHex(license1,0));
  readln;

  {debug use}
  write('Serial portion: ');
  serialNumber := license1 and $FFF00000;
  writeln(IntToHex(serialNumber,12));
  readln;

  writeln('Enter serial number (S0xxx):');
  readln(serialNumber2);

  {replace the first letter of the serial with a number'}
  serialNumber2[1] := '0';

  {convert serialNumber2 string to newNum in Integer value}
  newNum := StrToInt(serialNumber2);
  writeln(newNum);

  writeln('Serial code entered: ', 'S0', newNum);
  readln();

end. 

输出:

license in hex: 520054001935
Serial Portion: 000054000000
delphi pascal lazarus freepascal
1个回答
0
投票
program SO58271986;

uses
  sysutils;

var license1, serialNumber : int64;
    serialNumber2 : String;
    Check : Word;
    newNum : Word;

begin
  writeln('Enter Current License:');
  readln(license1);
  {debug use}
  writeln('License in HEX: ', IntToHex(license1,0));
  {debug use}
  write('Serial portion: ');
  serialNumber := license1 and $FFF00000;
  writeln(IntToHex(serialNumber,12));
  writeln('Enter serial number (S0xxx):');
  readln(serialNumber2);
  {replace the first letter of the serial with a number'}
  serialNumber2[1] := '0';
  {convert serialNumber2 string to newNum in Integer value}
  newNum := StrToInt('$'+serialNumber2);
  writeln('Serial code entered: ', 'S', IntToHex(newNum));
  Check := serialNumber div $100000; // shift serial portion 5 digits to the right
  writeln('Serial check: ', 'S', IntToHex(Check));
  if Check <> newNum then
   writeln('Invalid serial code!')
  else
   writeln('Serial code is correct!');
  readln;
end.

您几乎正在使用当前代码。2分:

  • [当读取十六进制数字作为字符串时,通过添加$符号将其转换为int,以便StrToInt知道您正在转换的是十六进制值而不是十进制值
  • 您可以通过将串行部分右移5位来比较许可证代码,这可以通过简单的整数除法($ 1 +位数)来实现]
© www.soinside.com 2019 - 2024. All rights reserved.