如何停止 Windows 控制台应用程序在显示二进制数据时触发蜂鸣声

发布于 12-07 02:25 字数 264 浏览 1 评论 0原文

我编写了一个 Windows 控制台应用程序,用于从第三方提供商接收二进制数据。 出于调试和日志记录的目的,我在输出(控制台)上显示二进制数据。

不幸的是,当显示字符 7 时,它会触发蜂鸣声。 这是可以触发它的代码:

int main(int argc, char** argv)
{
  char c = 7;
  std::cout << c;
}

我的问题很简单,有没有办法禁用蜂鸣声?

谢谢

I wrote a windows console application that receives binary data from a third party provider.
For Debug and logging purposes, I display the binary data on the output (the console).

Unfortunately when the character 7 is displayed it triggers a beep.
Here is a code that can trigger it:

int main(int argc, char** argv)
{
  char c = 7;
  std::cout << c;
}

My question is simple, is there a way to disable the beeps ?

Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

岁月静好2024-12-14 02:25:33

您可以拔掉计算机上的蜂鸣器。

如果这不是一个选择:
如果您有一个方法 debug(String s) 输出字符串 s,则可以将字符 7 替换为其他内容以避免发出蜂鸣声。

另一种方法是以十六进制形式输出文本。

You could unplug the beeper in your computer.

If that is not an option:
If you have a method debug(String s) that outputs the string s, you could replace character 7 by something else to avoid the beep.

Another way would be to output the text in hexadecimal form.

如日中天2024-12-14 02:25:33

还有很多其他值会触发奇怪的事情(取决于您使用的终端)。在输出之前,您应该使用 isprint 检查每个字符。更好的是像这样的函数:

void memdump( std::ostream& o, const void* data, size_t len )
{
        const unsigned char* ptr = static_cast<const unsigned char*>(data);

        for( size_t i = 0; i < len; i += 16 )
        {
                o << std::setw(8);
                o << std::setfill('0');
                o << std::hex << i << ' ';
                size_t to = std::min(len,i+16);
                for( size_t j = i; j < to; ++j )
                {
                        o << ' ';
                        o << std::setw(2);
                        o << std::setfill('0');
                        o << std::hex;
                        o << (unsigned)ptr[j];

                        if( (j+1) % 8 == 0 )
                        {
                                o << ' ';
                        }
                }
                o << "  ";
                for( size_t j = to; j < i+16; ++j )
                {
                        o << "   ";
                        if( (j+1) % 8 == 0 )
                        {
                                o << ' ';
                        }
                }

                for( size_t j = i; j < to; ++j )
                {
                        if(isprint(ptr[j]))
                        {
                                o << ptr[j];
                        }
                        else
                        {
                                o << '.';
                        }
                        if( (j+1) % 8 == 0 )
                        {
                                o << ' ';
                        }
                }
                o << '\n';
        }
        o << std::dec;
}

There is a lot of other values that will trigger weird things (depending on what terminal you use). You should check each char with isprint before outputting it. Better yet is a function like:

void memdump( std::ostream& o, const void* data, size_t len )
{
        const unsigned char* ptr = static_cast<const unsigned char*>(data);

        for( size_t i = 0; i < len; i += 16 )
        {
                o << std::setw(8);
                o << std::setfill('0');
                o << std::hex << i << ' ';
                size_t to = std::min(len,i+16);
                for( size_t j = i; j < to; ++j )
                {
                        o << ' ';
                        o << std::setw(2);
                        o << std::setfill('0');
                        o << std::hex;
                        o << (unsigned)ptr[j];

                        if( (j+1) % 8 == 0 )
                        {
                                o << ' ';
                        }
                }
                o << "  ";
                for( size_t j = to; j < i+16; ++j )
                {
                        o << "   ";
                        if( (j+1) % 8 == 0 )
                        {
                                o << ' ';
                        }
                }

                for( size_t j = i; j < to; ++j )
                {
                        if(isprint(ptr[j]))
                        {
                                o << ptr[j];
                        }
                        else
                        {
                                o << '.';
                        }
                        if( (j+1) % 8 == 0 )
                        {
                                o << ' ';
                        }
                }
                o << '\n';
        }
        o << std::dec;
}
记忆里有你的影子2024-12-14 02:25:33

禁用蜂鸣器的方法(在 Windows 命令行):

net stop beep

它应该暂时禁用蜂鸣器。如果您想要完整的效果(重新启动时重新应用),请输入以下命令:

sc config beep start= disabled

A way to disable the beeper (at a Windows command line):

net stop beep

It should disable beeps temporarily. If you want the full effect (re-applies on reboot) type this:

sc config beep start= disabled
旧城空念2024-12-14 02:25:33

char c = 7; 根据 ASCII 是一个 BELL
如果你想显示 7 那么你需要将其用单引号括起来(或者它们的调用方式:

char c = '7';

如果你不想显示 7 那么你需要删除字符 0x07 或将其替换为(例如'')
(http://www.asciitable.com/)

char c = 7; is a BELL according to ASCII
if you want to display the 7 then you need to wrap it in single quotations marks (or how they are called:

char c = '7';

If you don't want to display a 7 then you need to remove the character 0x07 or replace it with (for example with '')
(http://www.asciitable.com/)

め可乐爱微笑2024-12-14 02:25:33

选择将字符 7 解释为字形而不是控制字符的代码页。有关详细信息,请参阅我的其他答案

Select a code page that interprets the character 7 as a glyph instead of a control character. See my other answer for details.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文