2012-02-20 2 views
1

Работа в Java, здесь спецификация я есть для того, чтобы реализовать вычисление контрольной суммы на символьных сообщений:Как вычислить «двоичные значения сложение символов» для контрольной суммы

8.3.3 Checksum—The checksum permits the receiver to detect a defective frame. The checksum is encoded as two characters which are sent after the <ETB> or <ETX> character. The checksum is computed by adding the binary values of the characters, keeping the least significant eight bits of the result. 
    8.3.3.1 The checksum is initialized to zero with the <STX> character. The first character used in computing the checksum is the frame number. Each character in the message text is added to the checksum (modulo 256). The computation for the checksum does not include <STX>, the checksum characters, or the trailing <CR> and <LF>. 
    8.3.3.2 The checksum is an integer represented by eight bits, it can be considered as two groups of four bits. The groups of four bits are converted to the ASCII characters of the hexadecimal representation. The two ASCII characters are transmitted as the checksum, with the most significant character first. 
    8.3.3.3 For example, a checksum of 122 can be represented as 01111010 in binary or 7A in hexadecimal. The checksum is transmitted as the ASCII character 7 followed by the character A. 

Вот что я понимаю и реализовано, но это, кажется, не работают ...:

private void computeAndAddChecksum(byte[] bytes, OutputStream outputStream) { 
    logBytesAsBinary(bytes); 
    long checksum = 0; 
    for (int i = 0; i < bytes.length; i++) { 
     checksum += (bytes[i] & 0xffffffffL); 
      } 
      int integerChecksum = (int)checksum; 
    String hexChecksum = Integer.toHexString(integerChecksum).toUpperCase(); 
    logger.info("Checksum for "+new String(bytes)+" is "+checksum+" in hexa: "+hexChecksum); 
    try { 
     if (outputStream != null) 
     { 
      outputStream.write(hexChecksum.getBytes()); 
     } 
    } catch (IOException e) { 
     logger.error(e.getMessage()); 
    } 
} 

ли вам какие-либо идеи, почему этот фрагмент не приспособленные к спецификации? Вот пример я был дан, если это может помочь:

<STX>3L|1<CR><ETX>3C<CR><LF> 

так контрольная сумма

3L|1<CR><ETX> 

должен быть

3C 

Большое спасибо вам помочь.

+0

«это не кажется, работают », - что * точно * вы имеете в виду? – Bohemian

ответ

0

Ваша спецификация говорит:

  • контрольная сумма должна быть инициализирована с номером кадра.

Вот фрагмент, который возвращает ожидаемый результат, но я не знаю, где номер кадра происходит от (surey в другом месте в вашей спецификации)

public class ChecksumBuilder { 
public static String getFrameCheckSum(String frametext,int framenum) 
{ 
    byte[] a=frametext.getBytes(); 

    int checksum=framenum; 
    for(int i=0;i<a.length;i++) 
    {   
     checksum+=a[i]; 
    } 

    String out=String.format("%02x",(checksum & 0xFF)).toUpperCase(); 
    return out; 
} 

public static void main(String[] args) 
{ 
    System.out.print(ChecksumBuilder.getFrameCheckSum("3L|1<CR>",1)); 
} 

}

+0

Большое спасибо за вашу помощь! Во всяком случае, я только что понял, что спецификация не была отформатирована правильно, потому что не помещала ее в блок кода. Я изменил сообщение, так что теперь все в порядке. И вы увидите, что значение может быть не тем, которое вы понимаете, прочитав его в первый раз ... извините: моя вина! И номер кадра является первым «3» символом в моем сообщении, просто чтобы сказать, что вычисления контрольной суммы должны начинаться оттуда. Еще раз спасибо – Max

+0

, если это помогло, пожалуйста, проголосуйте и подтвердите ответ;) – dweeves

+0

Ну да спасибо за вашу помощь, но на самом деле это не отвечает на вопрос. Ваш код очень похож на мой и не соответствует спецификации. но хорошо, я даю вам голос за вашу доброту;) – Max

Смежные вопросы